मैं एक प्रोग्राम लिख रहा हूं जो लिंक्ड सूचियों का उपयोग करके 2 दिए गए बहुपदों को तीसरे में जोड़ता है लेकिन परिणाम लिंक्ड सूची विपरीत क्रम में है और मैं इसके चारों ओर अपना सिर नहीं ले सकता

इनपुट: (10x7 + 5x4 + 3x2 + 5) + (3x8 + 3x4 + 3x -6)

परिणाम: -1x0 + 3x + 3x2 + 8x4 + 10x7 + 3x8

मुझे यह चाहिए: 3x8 + 10x7 + 8x4 + 3x2 +3x -1x0

वे कार्य हैं:

typedef struct term
{
    int coef;
    int exp;
    struct term *next;
} term;
        
void Push2(term **headRef, int coef, int exp)
{
    struct term *newNode = (term *)malloc(sizeof(term));
    if (coef == 0)
        return;
            
    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = *headRef;
    *headRef = newNode;
}

term *addPolynomials2(term *h1, term *h2)
{
    term *current1 = h1;
    term *current2 = h2;
        
    term *new = NULL;
    while (current1 && current2)
    {
        if (current1->exp == current2->exp)
        {
            Push2(&new, (current1->coef + current2->coef), current1->exp);
            current1 = current1->next;
            current2 = current2->next;
        }
        else if (current1->exp > current2->exp)
        
        {
            Push2(&new, current1->coef, current1->exp);
            current1 = current1->next;
        }
        
        else
        {
            Push2(&new, current2->coef, current2->exp);
            current2 = current2->next;
        }
    }

    while (current1)
    {
        Push2(&new, current1->coef, current1->exp);
        current1 = current1->next;
    }

    while (current2)
    {
        Push2(&new, current2->coef, current2->exp);
        current2 = current2->next;
    }

    return new;
}

void printTerm(term head)
{
    printf("%dx%d ", head.coef, head.exp);
}

void printPolynomial(term *head)
{
    if (head == 0)
        return;
            
    printTerm(*head);
    printPolynomial(head->next);
}

void addPolynomialsTest2()
{
    term *head1 = NULL;
    term *head2 = NULL;
    term *new;
    int a[] = {10, 0, 0, 5, 0, 3, 0, 5};
    
    int b[] = {7, 6, 5, 4, 3, 2, 1, 0};
    for (int i = sizeof(a) / sizeof(int) - 1; i >= 0; i--)
    {
        Push2(&head1, a[i], b[i]);
    }
    
    int c[] = {8, 7, 6, 5, 4, 3, 2, 1, 0};
    int d[] = {3, 0, 0, 0, 3, 0, 0, 3, -6};
    for (int i = sizeof(d) / sizeof(int) - 1; i >= 0; i--)
    {
    
        Push2(&head2, d[i], c[i]);
    }
    printf("F(x)= ");
    printPolynomial(head2);
    printf("\n");
    printf("Q(x)= ");
    printPolynomial(head1);
    printf("\n");
    printf("F(x) + Q(X)= ");
    new = addPolynomials2(head1, head2);
    printPolynomial(new);
    printf("\n");
    printf("\n");
}
0
mrreaper72 27 जिंदा 2021, 07:41

2 जवाब

सबसे बढ़िया उत्तर

आपका Push2 हमेशा सूची के सामने (यानी सिर) की ओर धकेलता है।

संयोजन/जोड़ते समय, आपको एक पुश की आवश्यकता होती है जो सूची के पूंछ से जुड़ जाता है।

साथ ही, मैं सोचता हूं आप चाहते हैं कि योग 8x4 हो और नहीं 3x4 जैसा कि आप कहते हैं (यानी आपका प्रोग्राम सही है, आदेश को छोड़कर उलटा) क्योंकि प्रत्येक इनपुट बहुपद में एक x4 पद होता है।

साथ ही, आपके प्रिंट बहुपद फ़ंक्शन को पुनरावर्ती होने की आवश्यकता नहीं है।

और, malloc का परिणाम न डालें


यहाँ कुछ डिबग प्रिंट के साथ एक रिफैक्टेड संस्करण है। मैंने जोड़ने के लिए दूसरा पुश फ़ंक्शन बनाया है। TERM [मैक्रो] पर ध्यान न दें - इससे पहले कि मुझे वास्तविक समस्या मिली, यह स्पष्टता का एक अधूरा प्रयास था।

#include <stdio.h>
#include <stdlib.h>

typedef struct term {
    int coef;
    int exp;
    struct term *next;
} term;

#ifdef DEBUG
#define dbgprt(_fmt...) \
    printf(_fmt)
#else
#define dbgprt(_fmt...) \
    do { } while (0)
#endif

typedef void (*pushfnc_p)(term **headRef, int coef, int exp);

void
Push2(term **headRef, int coef, int exp)
{
    term *newNode = malloc(sizeof(*newNode));

    if (coef == 0)
        return;

    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = *headRef;
    *headRef = newNode;
}

void
Push2_tail(term **headRef, int coef, int exp)
{
    term *newNode = malloc(sizeof(*newNode));
    term *head = *headRef;

    if (coef == 0)
        return;

    term *prev = NULL;
    for (struct term *cur = head;  cur != NULL;  cur = cur->next)
        prev = cur;

    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = NULL;

    if (prev != NULL)
        prev->next = newNode;
    else
        head = newNode;

    *headRef = head;
}

term *
addPolynomials2(term *h1, term *h2)
{
    term *current1 = h1;
    term *current2 = h2;
#if 0
    pushfnc_p push = Push2;
#else
    pushfnc_p push = Push2_tail;
#endif

    term *new = NULL;

    while (current1 && current2) {
        dbgprt("add: DUAL current1=%dX%d current2=%dX%d\n",
            current1->coef,current1->exp,
            current2->coef,current2->exp);

        if (current1->exp == current2->exp) {
            dbgprt("add: SAME\n");
            push(&new, (current1->coef + current2->coef), current1->exp);
            current1 = current1->next;
            current2 = current2->next;
            continue;
        }

        if (current1->exp > current2->exp) {
            dbgprt("add: CURR1\n");
            push(&new, current1->coef, current1->exp);
            current1 = current1->next;
            continue;
        }

        dbgprt("add: CURR2\n");
        push(&new, current2->coef, current2->exp);
        current2 = current2->next;
    }

    while (current1) {
        dbgprt("add: POST1 current1=%dX%d\n",
            current1->coef,current1->exp);
        push(&new, current1->coef, current1->exp);
        current1 = current1->next;
    }

    while (current2) {
        dbgprt("add: POST2 current2=%dX%d\n",
            current2->coef,current2->exp);
        push(&new, current2->coef, current2->exp);
        current2 = current2->next;
    }

    return new;
}

void
printTerm(term *head)
{
    printf("%dx%d ", head->coef, head->exp);
}

void
printPolynomial(term *head)
{

    for (;  head != NULL;  head = head->next)
        printTerm(head);
}

#define TERM(_coef,_exp) \
    { .coef = _coef, .exp = _exp },

void
addPolynomialsTest2(void)
{
    term *head1 = NULL;
    term *head2 = NULL;
    term *new;

#if 1
    int a[] = { 10, 0, 0, 5, 0, 3, 0, 5 };
    int b[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
    for (int i = sizeof(a) / sizeof(int) - 1; i >= 0; i--) {
        Push2(&head1, a[i], b[i]);
    }

    int c[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int d[] = { 3, 0, 0, 0, 3, 0, 0, 3, -6 };
    for (int i = sizeof(d) / sizeof(int) - 1; i >= 0; i--) {
        Push2(&head2, d[i], c[i]);
    }
#else
    term a[] = {
        TERM(10,7)
        TERM(0,6)
        TERM(0,5)
        TERM(5,4)
        TERM(0,3)
        TERM(3,2)
        TERM(0,5)
    };
    for (int i = sizeof(a) / sizeof(term) - 1; i >= 0; i--) {
        term *t = &a[i];
        Push2(&head1,t->coef,t->exp);
    }
#endif

    printf("F(x)= ");
    printPolynomial(head2);
    printf("\n");
    printf("Q(x)= ");
    printPolynomial(head1);
    printf("\n");
    printf("F(x) + Q(X)= ");
    new = addPolynomials2(head1, head2);
    printPolynomial(new);
    printf("\n");
    printf("\n");
}

int
main(void)
{
    addPolynomialsTest2();
    return 0;
}

यहाँ प्रोग्राम आउटपुट है:

F(x)= 3x8 3x4 3x1 -6x0
Q(x)= 10x7 5x4 3x2 5x0
F(x) + Q(X)= 3x8 10x7 8x4 3x2 3x1 -1x0

अद्यतन करें:

मैंने परिणाम को रिवर्स में प्रिंट करके अंत में डालने के बिना इसे करने की कोशिश की लेकिन आउटपुट भी अजीब था, कोई विचार क्यों?

पूरा यकीन नहीं है। ऐसा लगता है कि दो गलत सही कर रहे हैं ... नीचे देखें।

बहुपदों को बनाने में, पुश-टू-फ्रंट का उपयोग करने वाला आपका कोड काम करता है, लेकिन, IMO, यह थोड़ा अधिक जटिल है क्योंकि आपको सरणियों के माध्यम से उल्टे क्रम में लूप करना होता है .

हालांकि, ऐड फंक्शन करता है को पुश-टू-टेल की जरूरत होती है। पुश-टू-फ्रंट के साथ, ऐड विफल हो जाएगा। इसलिए, गलत ऐड फंक्शन के लिए "क्षतिपूर्ति" करने के लिए उल्टे क्रम में प्रिंट करने का प्रयास एक वैध फिक्स नहीं हो सकता है।

इसलिए, मूल कोड के साथ, आपके पास दो इनपुट बहुपद उच्च-से-निम्न क्रम में थे [जैसा कि हम चाहेंगे], लेकिन आउटपुट बहुपद का क्रम उलट था .

इसलिए, यदि आप आउटपुट को किसी अन्य चीज़ में जोड़ने का प्रयास करते हैं (उदाहरण के लिए फिर से इनपुट में से एक), तो यह ब्रेक होगा।

इसलिए, रिवर्स प्रिंटिंग द्वारा क्षतिपूर्ति करने से समस्या का समाधान नहीं होता है। यह इसे केवल छपाई के लिए मास्क करता है।

पुश-टू-फ्रंट की वास्तव में आवश्यकता नहीं है। मुझे TERM मैक्रो काम कर रहा है। यह पुश-टू-टेल का उपयोग करता है और सरणी को 0 से N [समझने में आसान] तक ले जाता है।

तो, यह है, आईएमओ, थोड़ा क्लीनर:

#include <stdio.h>
#include <stdlib.h>

typedef struct term {
    int coef;
    int exp;
    struct term *next;
} term;

#ifdef DEBUG
#define dbgprt(_fmt...) \
    printf(_fmt)
#else
#define dbgprt(_fmt...) \
    do { } while (0)
#endif

typedef void (*pushfnc_p)(term **headRef, int coef, int exp);

void
Push2(term **headRef, int coef, int exp)
{
    term *newNode = malloc(sizeof(*newNode));

    if (coef == 0)
        return;

    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = *headRef;
    *headRef = newNode;
}

void
Push2_tail(term **headRef, int coef, int exp)
{
    term *newNode = malloc(sizeof(*newNode));
    term *head = *headRef;

    if (coef == 0)
        return;

    term *prev = NULL;
    for (struct term *cur = head;  cur != NULL;  cur = cur->next)
        prev = cur;

    newNode->coef = coef;
    newNode->exp = exp;
    newNode->next = NULL;

    if (prev != NULL)
        prev->next = newNode;
    else
        head = newNode;

    *headRef = head;
}

term *
addPolynomials2(term *h1, term *h2)
{
    term *current1 = h1;
    term *current2 = h2;
#if 0
    pushfnc_p push = Push2;
#else
    pushfnc_p push = Push2_tail;
#endif

    term *new = NULL;

    while (current1 && current2) {
        dbgprt("add: DUAL current1=%dX%d current2=%dX%d\n",
            current1->coef,current1->exp,
            current2->coef,current2->exp);

        if (current1->exp == current2->exp) {
            dbgprt("add: SAME\n");
            push(&new, (current1->coef + current2->coef), current1->exp);
            current1 = current1->next;
            current2 = current2->next;
            continue;
        }

        if (current1->exp > current2->exp) {
            dbgprt("add: CURR1\n");
            push(&new, current1->coef, current1->exp);
            current1 = current1->next;
            continue;
        }

        dbgprt("add: CURR2\n");
        push(&new, current2->coef, current2->exp);
        current2 = current2->next;
    }

    while (current1) {
        dbgprt("add: POST1 current1=%dX%d\n",
            current1->coef,current1->exp);
        push(&new, current1->coef, current1->exp);
        current1 = current1->next;
    }

    while (current2) {
        dbgprt("add: POST2 current2=%dX%d\n",
            current2->coef,current2->exp);
        push(&new, current2->coef, current2->exp);
        current2 = current2->next;
    }

    return new;
}

void
printTerm(term *head)
{
    printf("%dx%d ", head->coef, head->exp);
}

void
printPolynomial(term *head)
{

    for (;  head != NULL;  head = head->next)
        printTerm(head);
}

#define TERM(_coef,_exp) \
    { .coef = _coef, .exp = _exp },

void
addPolynomialsTest2(void)
{
    term *head1 = NULL;
    term *head2 = NULL;
    term *new;

#if 0
    int a[] = { 10, 0, 0, 5, 0, 3, 0, 5 };
    int b[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
    for (int i = sizeof(a) / sizeof(int) - 1; i >= 0; i--) {
        Push2(&head1, a[i], b[i]);
    }

    int c[] = { 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int d[] = { 3, 0, 0, 0, 3, 0, 0, 3, -6 };
    for (int i = sizeof(d) / sizeof(int) - 1; i >= 0; i--) {
        Push2(&head2, d[i], c[i]);
    }
#else
    term ab[] = {
        TERM(10,7)
        TERM(0,6)
        TERM(0,5)
        TERM(5,4)
        TERM(0,3)
        TERM(3,2)
        TERM(0,5)
    };
    for (int i = 0;  i < sizeof(ab) / sizeof(term); ++i) {
        term *t = &ab[i];
        Push2_tail(&head1,t->coef,t->exp);
    }

    term cd[] = {
        TERM(3,8)
        TERM(0,7)
        TERM(0,6)
        TERM(0,5)
        TERM(3,4)
        TERM(0,3)
        TERM(0,2)
        TERM(3,1)
        TERM(-6,0)
    };
    for (int i = 0;  i < sizeof(cd) / sizeof(term); ++i) {
        term *t = &cd[i];
        Push2_tail(&head2,t->coef,t->exp);
    }
#endif

    printf("F(x)= ");
    printPolynomial(head2);
    printf("\n");
    printf("Q(x)= ");
    printPolynomial(head1);
    printf("\n");
    printf("F(x) + Q(X)= ");
    new = addPolynomials2(head1, head2);
    printPolynomial(new);
    printf("\n");
    printf("\n");
}

int
main(void)
{
    addPolynomialsTest2();
    return 0;
}

यह एक विवादास्पद मुद्दा है क्योंकि आउटपुट को उल्टे क्रम में बनाना गलत है (अर्थात ऐसा करें नहीं करें)।

लेकिन, अब, मैं समझता हूं कि आप बहुपद को प्रिंट करने के लिए पुनरावर्ती फ़ंक्शन क्यों चाहते थे।

रिवर्स क्रम में प्रिंट करने के लिए, मैं सोचता हूं फ़ंक्शन को वर्तमान शब्द बाद पुनरावर्ती कॉल करने के बाद प्रिंट करना होगा। मैंने यह नहीं सोचा है [या इसका परीक्षण किया है]:

void
printTerm(term *head)
{
    printf("%dx%d ", head->coef, head->exp);
}

void
printPolynomial(term *head)
{

    if (head == 0)
        return;

#if 0
    printTerm(head);
    printPolynomial(head->next);
#else
    printPolynomial(head->next);
    printTerm(head);
#endif
}

यह परिणाम बहुपद के प्रिंट को संभव ठीक कर सकता है।

लेकिन, ऐसा करने से दो इनपुट बहुपदों की छपाई तोड़ हो जाएगी।

1
Craig Estey 27 जिंदा 2021, 09:31
void Reverse(term *Node)
{
if(Node== NULL) return;

Reverse(Node->next);
printTerm(*Node);
}

और PrintPolynomial(New) के बजाय Reverse(New) को कॉल करें

आउटपुट: एफ (एक्स) + क्यू (एक्स) = 3x8 10x7 8x4 3x2 3x1 -1x0

पूर्ण समाधान:

#include<stdio.h>
#include<stdlib.h>

typedef struct term
{
int coef;
int exp;
struct term *next;

} term;


void Push2(term **headRef, int coef, int exp)
{
struct term *NewNode = (term *)malloc(sizeof(term));
if (coef == 0)
    return;

NewNode->coef = coef;
NewNode->exp = exp;
NewNode->next = *headRef;
*headRef = NewNode;
}

term *addPolynomials2(term *h1, term *h2)
{
term *current1 = h1;
term *current2 = h2;

term *New = NULL;
while (current1 && current2)

{
    if (current1->exp == current2->exp)
    {
        Push2(&New, (current1->coef + current2->coef), current1->exp);
        current1 = current1->next;
        current2 = current2->next;
    }
    else if (current1->exp > current2->exp)

    {
        Push2(&New, current1->coef, current1->exp);
        current1 = current1->next;
    }

    else
    {
        Push2(&New, current2->coef, current2->exp);
        current2 = current2->next;
    }
}
while (current1)
{
    Push2(&New, current1->coef, current1->exp);
    current1 = current1->next;
}
while (current2)
{
    Push2(&New, current2->coef, current2->exp);
    current2 = current2->next;
}
return New;
}

void printTerm(term head)
{
 printf("%dx%d ", head.coef, head.exp);
}

void Reverse(term *Node)
{
if(Node== NULL)
    return;
Reverse(Node->next);
printTerm(*Node);
}

void printPolynomial(term *head)
{
if (head == 0)
    return;

printTerm(*head);
printPolynomial(head->next);
 }
void addPolynomialsTest2()
{
term *head1 = NULL;
term *head2 = NULL;
term *New;
int a[] = {10, 0, 0, 5, 0, 3, 0, 5};

int b[] = {7, 6, 5, 4, 3, 2, 1, 0};
for (int i = sizeof(a) / sizeof(int) - 1; i >= 0; i--)
{

    Push2(&head1, a[i], b[i]);
}

int c[] = {8, 7, 6, 5, 4, 3, 2, 1, 0};
int d[] = {3, 0, 0, 0, 3, 0, 0, 3, -6};
for (int i = sizeof(d) / sizeof(int) - 1; i >= 0; i--)
{

    Push2(&head2, d[i], c[i]);
}
printf("F(x)= ");
printPolynomial(head2);
printf("\n");
printf("Q(x)= ");
printPolynomial(head1);
printf("\n");
printf("F(x) + Q(X)= ");
New = addPolynomials2(head1, head2);

while(New!= NULL)
{
    printTerm(*New);
    New = New->next;
}
Reverse(New);
printf("\n");
printf("\n");
}
int main()
{
addPolynomialsTest2();
}
1
Nitai Chandra Banik 27 जिंदा 2021, 09:09