一元多项式的加法和乘法(链表实现)

原题链接:https://pta.patest.cn/pta/test/15/exam/4/question/710

题目:

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0




代码:
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 /*  定义结构,但是更推荐这种定义
  4   typedef struct PolyNode{
  5       int coef;
  6       int expon;
  7       struct PolyNode *Next;
  8   }*PolyNode;                      */
  9 typedef struct PolyNode *Polynomial ;
 10 struct PolyNode
 11 {
 12     int coef;
 13     int expon;
 14     Polynomial Next;
 15 };
 16 /*连接函数,通过参数的传递,构成链表,注意*rear是指针的指针,故能修改rear的地址(值)*/
 17 void Attach(int coef,int expon,Polynomial *rear)
 18 {
 19     Polynomial P;
 20     P=(Polynomial)malloc(sizeof(struct PolyNode));
 21     P->coef=coef;
 22     P->expon=expon;
 23     P->Next=NULL;
 24     (*rear)->Next=P;
 25     (*rear)=P;
 26 }
 27    /* 读入数据函数*/
 28 Polynomial ReadPoly()
 29 {
 30     int N;
 31     int coef,expon;
 32     Polynomial P,rear,t;
 33     P=(Polynomial)malloc(sizeof(struct PolyNode));   //采用开头构造空节点P的方法
 34     P->Next=NULL;
 35     rear=P;
 36     scanf("%d",&N);
 37     while(N--)
 38     {
 39         scanf("%d %d",&coef,&expon);
 40         Attach(coef,expon,&rear);
 41     }
 42     t=P;
 43     P=P->Next;
 44     free(t);   //将空节点删除
 45     return P;
 46 }
 47     /* 加法的实现函数 */
 48 Polynomial Add(Polynomial P1,Polynomial P2)
 49 {
 50     Polynomial P,rear,t;
 51     P=(Polynomial)malloc(sizeof(struct PolyNode));   //创建空节点
 52     P->Next=NULL;
 53     rear=P;   //  rear 指向P
 54     int sum;
 55     while(P1 && P2)
 56     {
 57         if (P1->expon>P2->expon)                //按指数递减的顺序排列
 58         {
 59             Attach(P1->coef,P1->expon,&rear);   //拷贝P1,P1后移,依次类推
 60             P1=P1->Next;
 61         }
 62        else if (P1->expon<P2->expon)
 63         {
 64             Attach(P2->coef,P2->expon,&rear);
 65             P2=P2->Next;
 66         }
 67         else
 68         {
 69             sum=P1->coef+P2->coef;
 70            if (sum) Attach(sum,P1->expon,&rear);  //系数之和不为0才拷贝,P1,P2同时后移
 71             P1=P1->Next;
 72             P2=P2->Next;
 73         }
 74     }
 75     while (P1){Attach(P1->coef,P1->expon,&rear);P1=P1->Next;}  //继续将剩下的拷贝过去
 76     while (P2){Attach(P2->coef,P2->expon,&rear);P2=P2->Next;}
 77     t=P;
 78     P=P->Next;
 79     free(t);   //释放空的头节点
 80     return P;
 81 }
 82      /* 乘法实现的函数 */
 83 Polynomial Mult(Polynomial P1,Polynomial P2)
 84 {
 85     Polynomial P,rear,t1,t2,t;
 86     int c,e;
 87     if (!P1 || !P2)  return NULL;
 88     t1 = P1;
 89     t2 = P2;
 90     P = (Polynomial)malloc(sizeof(struct PolyNode));
 91     P->Next = NULL;
 92     rear = P;
 93     while(t2)   //先得出一个链表,即P1的第一项分别和P2的每一项相乘
 94     {
 95         Attach(t1->coef * t2->coef,t1->expon + t2->expon,&rear);
 96         t2 = t2->Next;
 97     }
 98     t1=t1->Next;
 99     while (t1)    //将每一项结果和原始链表对比,对原始链表进行增,改,删等操作
100    {
101         t2 = P2;
102         rear = P;
103          while(t2)
104           {
105             e = t1->expon + t2->expon;
106             c = t1->coef * t2->coef;
107             while(rear->Next && rear->Next->expon>e )rear=rear->Next;  //!!!一定注意&&前后表达式顺序不能反!
108             if (rear->Next && rear->Next->expon==e)
109             {
110                 if(rear->Next->coef+c)rear->Next->coef+=c;
111                 else{t=rear->Next;rear->Next=t->Next;free(t);}//删除该节点
112             }
113             else  //<e, 在rear后插入一个新的节点
114             {
115                 t=(Polynomial)malloc(sizeof(struct PolyNode));
116                 t->coef=c;
117                 t->expon=e;
118                 t->Next=rear->Next;
119                 rear->Next=t;
120                 rear=rear->Next;
121             }
122             t2=t2->Next;
123        }
124          t1=t1->Next;
125   }
126     t=P;
127     P=P->Next;
128     free(t);  //释放空的头节点
129     return P;
130 }
131 /* 输出函数 */
132 void PrintPoly(Polynomial P)
133 {
134     int flag=0;
135     if(!P){printf("0 0
");return;}
136     while(P)
137    {
138        if (!flag)flag=1;   //符合题目要求格式,即结尾没有空格
139        else printf(" ");
140        printf("%d %d",P->coef,P->expon);
141        P=P->Next;
142    }
143    printf("
");
144 }
145 int main()
146 {
147   Polynomial P1,P2,PP,PS;
148   P1=ReadPoly();
149   P2=ReadPoly();
150   PP=Mult(P1,P2);
151   PrintPoly(PP);
152   PS=Add(P1,P2);
153   PrintPoly(PS);
154   return 0;
155 }
原文地址:https://www.cnblogs.com/wuxiaotianC/p/5764659.html