求两个一元多项式的乘积与和(C语言)
2018-06-18 03:50:01来源:未知 阅读 ()
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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> typedef struct PolyNode *Polynomial; struct PolyNode { int coef; int expon; Polynomial link; }; 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指向的新结点插入到当前尾项的后面*/ *pRear=P; /*pRear指针移动到 P结点*/ } int Compare(int a,int b){ int c; if (a>b) c=1; else if (a<b) c=-1; else c=0; return c; } Polynomial ReadPoly(){ Polynomial P,Rear,t; int c,e,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 Add(Polynomial P1,Polynomial P2){ Polynomial front,rear,temp; int sum; rear=(Polynomial)malloc(sizeof(struct PolyNode)); front=rear;//front 用来记录链表头结点 while(P1&&P2){ switch(Compare(P1->expon,P2->expon)){ case 1: Attach(P1->coef,P1->expon,&rear); P1=P1->link; break; case -1: Attach(P2->coef,P2->expon,&rear); P2=P2->link; break; case 0: sum=P1->coef+P2->coef; if (sum){ Attach(sum,P1->expon,&rear); } P1=P1->link; P2=P2->link; break; } } 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; temp=front; front=front->link; free(temp); return front; } Polynomial Mult(Polynomial P1,Polynomial P2){ Polynomial P,Rear,t1,t2,t; int c,e; if (!P1||!P2) return NULL;//判断如果P1或者P2有一个为NULL,则结果为NULL; t1=P1;t2=P2; P=(Polynomial)malloc(sizeof(struct PolyNode)); P->link=NULL; Rear=P; while(t2){ Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear); t2=t2->link; } t1=t1->link;//t1已经乘好,后移 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->link;//当相乘得到的 e小于多项式系数时,Rear指针往后移 if(Rear->link && Rear->link->expon==e){ if(Rear->link->coef+c) Rear->link->coef+=c;//如果多项式系数的和不为 0,则用新的系数赋值 else{ t=Rear->link; Rear->link=t->link; free(t);//如果多项式的系数为0,则 Rear指针指向下一个项,这个结点释放 } } else{ t=(Polynomial)malloc(sizeof(struct PolyNode)); t->coef=c;t->expon=e; t->link=Rear->link; Rear->link=t;Rear=Rear->link;//如果多项式没有到最后并且目前没有这一项,则分配内存空间,新建结点,并将结点插入链表,Rear指针指到新结点 t } t2=t2->link; } t1=t1->link; } t2=P;P=P->link;free(t2); return P; } void PrintPoly(Polynomial P){ int flag=0; //用于辅助调整输出格式 if(!P) {printf("0 0\n");return;} while (P){ if(!flag) flag=1; else printf(" "); 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=Add(P1,P2); PrintPoly(PS); return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:函数指针做函数参数
下一篇:使用递归倒序输出字符串
- 不借助多余参数也可交换两个参数(c++,swap函数) 2020-04-24
- 寻找两个有序数组的中位数 2020-04-09
- 指针的异或运算可用于交换两个变量的值 2019-12-15
- BJFU-225-基于链表的两个递增有序序列的合并 2019-10-28
- 两个数的差 2019-10-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash