user-0 提问: 求助一下大佬，其他的都没问题帮我看一下multpoly函数哪里出错了，实在不知道怎么错的，帮我一下，跪求

回复:
user: user-1
content: 仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h>  typedef struct Node *PtrToNode;  struct Node  {     int Coefficient;     int Exponent;     PtrToNode Next; }; typedef PtrToNode Polynomial;  Polynomial Read(Polynomial); /* details omitted */ void Print( Polynomial p ); /* details omitted */ Polynomial Add( Polynomial a, Polynomial b ); Polynomial Multpoly(Polynomial P1, Polynomial P2);  int main(void) {     Polynomial a, b, s1,s2;      a = Read(a);     //Print(a);     b = Read(b);     //Print(b);  #if 1     s2 = Add(a, b);     Print(s2); #else     s1=Multpoly(a, b);     Print(s1); #endif     return 0; }   Polynomial Multpoly(Polynomial P1, Polynomial P2) {     Polynomial P, temp1, temp2, Rear, temp;     int c, e;     if(!P1 || !P2)         return NULL;     temp1 = P1;     temp1=temp1->Next;     temp2 = P2;     temp2=temp2->Next;     P = (Polynomial)malloc(sizeof(struct Node));     P->Next = NULL;     Rear = P;     Rear=Rear->Next;     while(temp2){         c = temp1->Coefficient * temp2->Coefficient;         e = temp1->Exponent + temp2->Exponent;         if(c != 0){             temp = (Polynomial)malloc(sizeof( struct Node));   /* 类型不匹配*/             temp->Coefficient=c;             temp->Exponent=e;             Rear->Next=temp;             temp->Next=NULL;             Rear=Rear->Next;             temp2 = temp2->Next;         }     }     temp1 = temp1->Next;     while(temp1){         temp2 = P2;         temp2=temp2->Next;         Rear = P;         Rear=Rear->Next;         while(temp2){             c = temp1->Coefficient * temp2->Coefficient;             e = temp1->Exponent + temp2->Exponent;             if(c != 0){                 while(Rear->Next && Rear->Next->Exponent > e)                     Rear = Rear->Next;                 if(Rear->Next && Rear->Next->Exponent == e){                     if(Rear->Next->Coefficient + c)                         Rear->Next->Coefficient += c;                     /*else{                       temp = Rear->Next;                       Rear->Next = temp->Next;                       free(temp);                       }*/                 }                 else{                     temp = (Polynomial)malloc(sizeof( struct Node));                     temp->Coefficient = c;                     temp->Exponent = e;                     temp->Next=NULL;                     temp->Next = Rear->Next;                     Rear->Next = temp;                     Rear = Rear->Next;                 }                 temp2 = temp2->Next;             }         }         temp1 = temp1->Next;     }      /*    temp = P;           P = P->Next;           free(temp);*/     return P; }   Polynomial Add( Polynomial a, Polynomial b ) {     Polynomial s,temp;     s=(Polynomial)malloc(sizeof(struct Node));     s->Next=NULL;     temp = s;     a=a->Next;     b=b->Next;     while(a && b)     {         if(a->Exponent > b->Exponent)         {               temp->Next = a;             a = a->Next;             temp->Next->Next=NULL;             temp = temp->Next;           }         else if(b->Exponent > a->Exponent)         {             temp->Next=b;             b=b->Next;             temp->Next->Next=NULL;             temp=temp->Next;          }         else         {             Polynomial t, del;             t = (Polynomial)malloc(sizeof(struct Node));             t-> Coefficient = a-> Coefficient + b->Coefficient;             t->Exponent = a->Exponent;             t->Next = NULL;             if(t->Coefficient != 0)             {                 temp->Next = t;                 temp=temp->Next;             }             del = a;             a = a->Next;             free(del);              del = b;             b = b->Next;             free(del);         }     }     while(a)     {          temp->Next=a;         a = a->Next;         temp = temp->Next;       }     while(b)     {          temp->Next = b;         b = b->Next;         temp = temp->Next;     }     temp->Next=NULL;      return s;  } /*struct Node  {   int Coefficient;   int Exponent;   PtrToNode Next;   };   typedef PtrToNode Polynomial;*/ Polynomial Read(Polynomial L) {     int N;     Polynomial t,ptr;     L=(Polynomial)malloc(sizeof(struct Node));     L->Next=NULL;     t=L;     scanf("%d",&N);     while(N>0)     {         ptr=(Polynomial)malloc(sizeof(struct Node));         scanf("%d %d",&ptr->Coefficient,&ptr->Exponent);         L->Next=ptr;         ptr->Next=NULL;         L=L->Next;         N--;      }      return t;  } void Print(Polynomial L) {     Polynomial p = L->Next;     while(p) {         printf("+++%d %d\n",p->Coefficient,p->Exponent);         p = p->Next;     } } 多项式相加和多项式输出有些问题，帮你改了一下；目前，多项式相加没问题。 但是，需要注意的是多项式相加时，你已经将a或者b的多项式某些点加到了s多项式上，那么a,b已经不是原来的多项式链表了。所以，在执行多项式相乘就会有问题。 建议重新设计一下多项式相加，可以考虑多项式相加时，不对多项式a, b做修改（只是访问），而是通过创建新节点链接到s链表上。

user: user-3
content: 此外，你最上面的声明Polynomial Read(); 这句中Read函数应该是带有一个参数的

user: user-3
content: temp = (Polynomial*)malloc(sizeof(struct Node)); 这句你的temp是Polynomial类型，而你后面的是Polynomial*类型，将指针赋值给非指针，这里编译肯定出错