02-线性结构2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
代码如下:
#include<stdio.h> #include<stdlib.h> struct PolyNode{ int xishu; int zhishu; struct PolyNode * link; }; typedef struct PolyNode * Polynomial; void Attach(int xi, int zhi, Polynomial *prear)/*将结点连接起来*/ { Polynomial p = (Polynomial)malloc(sizeof(struct PolyNode)); p->xishu = xi; p->zhishu = zhi; p->link = NULL; (*prear)->link = p; *prear = p; } Polynomial read()/*读入数据*/ { Polynomial rear,t,p = (Polynomial)malloc(sizeof(struct PolyNode)); p->link = NULL; rear = p; int n; int xi,zhi; scanf("%d",&n); while(n--) { scanf("%d %d",&xi,&zhi); Attach(xi,zhi,&rear);/*这里传入rear的地址,才能在Attach函数中改变rear*/ } t = p; p = p->link; free(t);/*除去头结点*/ return p; } /*加法*/ Polynomial add(Polynomial p1,Polynomial p2) { Polynomial t1,t2,t,rear,pp = (Polynomial)malloc(sizeof(struct PolyNode)); pp->link = NULL; rear = pp; t1 = p1; t2 = p2; while(t1 != NULL && t2 != NULL) { if(t1->zhishu > t2->zhishu) { Attach(t1->xishu,t1->zhishu,&rear); t1 = t1->link; } else if(t1->zhishu == t2->zhishu) { if(t1->xishu + t2->xishu !=0)/*如等于0应舍去*/ { Attach(t1->xishu + t2->xishu,t1->zhishu,&rear); } t1 = t1->link; t2 = t2->link; } else { Attach(t2->xishu,t2->zhishu,&rear); t2 = t2->link; } } while(t1 != NULL)/*将未接上的结点接在链表后*/ { Attach(t1->xishu,t1->zhishu,&rear); t1 = t1->link; } while(t2 != NULL)/*将未接上的结点接在链表后*/ { Attach(t2->xishu,t2->zhishu,&rear); t2 = t2->link; } t = pp; pp = pp->link; free(t); return pp; } /*乘法*/ Polynomial mult(Polynomial p1,Polynomial p2) { if(!p1 || !p2)/*有一个为空就返回NULL*/ { return NULL; } Polynomial t1,t2,t,rear,ps = (Polynomial)malloc(sizeof(struct PolyNode)); ps->link = NULL; rear = ps; t1 = p1; t2 = p2;/*这一步很有必要,因为没写这一步,直接用p1,p2进行操作, 导致后面的while(p1!=NULL)里的while(p2!=NULL)没有运行,结果出错*/ int xi,zhi; while(t2 != NULL) { Attach(t1->xishu * t2->xishu,t1->zhishu + t2->zhishu,&rear); t2 = t2->link; } t1 = t1->link; while(t1 != NULL) { t2 = p2;/*重新指向p2开始的结点。如果没有将p2 赋给 t2,此时的p2指向的是NULL。会导致结果错误*/ rear = ps;/*回到头结点*/ while(t2 != NULL) { xi = t1->xishu * t2->xishu; zhi = t1->zhishu + t2->zhishu; while(rear->link && rear->link->zhishu > zhi)/*找插入单项式的位置*/ { rear = rear->link; } if(rear->link && rear->link->zhishu == zhi) { if(rear->link->xishu + xi != 0) { rear->link->xishu += xi; } else { t = rear->link; rear->link = t->link; free(t); } } else/*和加法不同的是,加法是直接将结点接在链表后,因此可以用Attach函数 而乘法要重复的扫描rear,找到适合的位置在插入进去,因此不能改变rear*/ { Polynomial pnew = (Polynomial)malloc(sizeof(struct PolyNode)); pnew->xishu = xi; pnew->zhishu = zhi; pnew->link = rear->link; rear->link = pnew; rear = pnew; } t2 = t2->link; } t1= t1->link; } t = ps; ps = ps->link; free(t); return ps; } void print(Polynomial p) { int flag = 0; if(!p) { printf("0 0\n"); return ; } while(p != NULL) { if(flag == 0) { flag = 1; } else { printf(" "); } printf("%d %d",p->xishu,p->zhishu); p = p->link; } printf("\n"); } int main(void) { Polynomial p1,p2,pp,ps; p1 = read(); p2 = read(); ps = mult(p1,p2); print(ps); pp = add(p1,p2); print(pp); return 0; }
- 时间限制:200ms
- 内存限制:64MB
- 代码长度限制:16kB
- 判题程序:系统默认
- 作者:DS课程组
- 单位:浙江大学