> 文档中心 > 1.4 多项式乘法与加法运算(C语言)

1.4 多项式乘法与加法运算(C语言)

多项式乘法与加法运算

      • 设计函数分别求两个一元多项式的乘积与和
      • 多项式乘法与加法运算实现源码
      • 运行

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

已知两个多项式
(1)3x4-5x2+6x-2
(2)5x20-7x4+3x

输入样例:4 3 4 -5 2 6 1 -2 03 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 15 20 -4 4 -5 2 9 1 -2 0

多项式乘法与加法运算实现源码

#include #include typedef int ElementType;  /* ElementType类型根据实际情况而定,这里假设为int */typedef struct PolyNode *Polynomial;struct PolyNode {     /* 队列中的结点结构 */ ElementType coef;  //系数ElementType expon;  //指数Polynomial link;  //指向下一个结点的指针};int Compare(int a,int b) {if (a > b) return(1);if (a < b)return(-1);else return(0);}/*将传入值加到Rear指向的结点后面(最后一位)*/void Attach(int c, int e, Polynomial *pRear) {Polynomial P;P = (Polynomial)malloc(sizeof(struct PolyNode));P->coef = c;  /*对新结点赋值*/P->expon = e;P->link = NULL;(*pRear)->link = P;/*把新申请的结点P插到rear的后面*/*pRear = P;  /*修改pRear值*/}/*读入多项式*/Polynomial ReadPoly() {Polynomial P, Rear, t;int c, e, N;printf("请输入第一位数N(共几项),后面为项目的系数指数,空格隔开\n");scanf("%d",&N);P = (Polynomial)malloc(sizeof(struct PolyNode));/*链表头空结点*/P->link = NULL;Rear = P;while (N--){scanf("%d %d",&c,&e);Attach(c,e,&Rear);     /*将当前项插入多项式尾部*/}t = P; P = P->link; free(t); /*删除临时生成的头结点*/return P;}/*两个多项式相加*/Polynomial PolyAdd(Polynomial P1, Polynomial P2) {Polynomial front, rear, temp; /*两个指针front和rear分别指向结果多项式的头和尾*/int sum;rear = (Polynomial)malloc(sizeof(struct PolyNode));/*申请一个空间,front和rear都指向它*/front = rear;  /*由front记录结果多项式链表头结点*/while(P1&&P2)  /*当两个多项式都有非零项待处理时*/switch (Compare(P1->expon, P2->expon)) {case 1:   /*P1->expon>P2->expon*/Attach(P1->coef, P1->expon, &rear);   /*将P1的当前项存入结果多项式,*/P1 = P1->link;  /*并使P1指向下一项*/break;case -1:  /*P1->exponexpon*/Attach(P2->coef, P2->expon, &rear); /*将P2的当前项存入结果多项式,*/P2 = P2->link; /*并使P2指向下一项*/break;case 0: /*P1->expon==P2->expon*/sum = P1->coef + P2->coef; /*系数相加,*/if (sum) Attach(sum,P1->expon,&rear); /*若结果不为0,则作为结果多项式对应项的系数。*/P1 = P1->link;P2 = P2->link;  /*同时,P1和P2都分别指向下一项*/break;}/*循环结束退出的时候,就是P1或P2里面有一个为空了*//*将未处理完的另一个多项式的所有结点依次复制到结果多项式中去*/for (; P1; P1 = P1->link) Attach(P1->coef,P1->expon,&rear);for (; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear);rear->link = NULL; /*rear指向结果多项式的最后一项,加完之后,最后一项没了,把link设为NULL*/temp = front;front = front->link; /*令front指向结果多项式第一个非零项*/free(temp);  /*释放临时空表头结点*/return front;}/*两个多项式相乘*/Polynomial Mult(Polynomial P1, Polynomial P2) {Polynomial P, Rear, t1, t2, t;int c, e;if (!P1||!P2) return NULL;t1 = P1; t2 = P2;P= (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL;Rear = P;while (t2) {/*先用P1的第一项乘以P2,得到P*/Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);t2 = t2->link;}t1 = t1->link;while (t1) {t2 = P2; Rear = P;while (t2) {e = t1->expon + t2->expon;c = t1->coef*t2->coef;while (Rear->link&&Rear->link->expon > e)/*Rear指向下一结点的指数是不是比准备插入的要大,*/Rear = Rear->link; /*如果大,Rear就不断往后挪*/if (Rear->link&&Rear->link->expon == e) {/*如果系数相等,就不插入,合并,*/if (Rear->link->coef + c)Rear->link->coef += c;else {t = Rear->link;Rear->link = t->link;free(t);}}else {/*如果不相等,比它小就插入进去*/t= (Polynomial)malloc(sizeof(struct PolyNode));t->coef = c; t->expon = e;t->link = Rear->link;Rear->link = t; Rear = Rear->link;}t2 = t2->link;}t1 = t1->link;}t2 = P; P = P->link; free(t2); /*将P指向结果多项式第一个非零项*/return P;}void PrintPoly(Polynomial P) {/*输出多项式*/int flag = 0;  /*辅助调整输出格式用*/if (!P) { printf("0 0\n"); return; }while (P) {if (!flag)flag = 1;elseprintf(" ");printf("%d %d",P->coef,P->expon);P = P->link;}printf("\n");}int main() {Polynomial P1, P2,PP,PS;P1 = ReadPoly();P2 = ReadPoly();PP = Mult(P1,P2); //乘PrintPoly(PP);PS=PolyAdd(P1, P2);//加PrintPoly(PS);return 0;}

运行

请输入第一位数N(共几项),后面为项目的系数指数,空格隔开4 3 4 -5 2 6 1 -2 0请输入第一位数N(共几项),后面为项目的系数指数,空格隔开3 5 20 -7 4 3 115 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 15 20 -4 4 -5 2 9 1 -2 0

爱K歌