博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表实现多项式的加法和乘法
阅读量:6701 次
发布时间:2019-06-25

本文共 4672 字,大约阅读时间需要 15 分钟。

#include
#include
#define LEN sizeof(PolyNode)typedef struct node{ //声明多项式节点的结构体表示 float coef; //系数 int exp; //指数 struct node* next;}PolyNode; //多项式节点typedef PolyNode* Polynomial; Polynomial create(){ //输入并创建链表的函数 Polynomial p,q,head=(Polynomial)malloc(LEN); float coef; int exp; head->next=NULL; printf("Please enter the coef and exp,ending with '0 0':"); while(scanf("%f %d",&coef,&exp)&&coef){ if(head->next){ p=head; while(p->next&&exp
next->exp) //找到要插入的位置,插在p节点的后面 p=p->next; if(p->next){ if(p->next->exp==exp){ //有相同指数时直接加到原来的节点上 p->next->coef+=coef; if(p->next->coef>-0.000001&&p->next->coef<0.000001){ //若系数之和为零,则舍去该点,浮点运算存在误差 q=p->next; p->next=q->next; free(q); } } else{ q=(Polynomial)malloc(LEN); q->coef=coef; q->exp=exp; q->next=p->next; p->next=q; } } else{ //若要插入的系数最小,插在最末 p->next=(Polynomial)malloc(LEN); p->next->coef=coef; p->next->exp=exp; p->next->next=NULL; } } else{ //插入第一个节点时 head->next=(Polynomial)malloc(LEN); head->next->coef=coef; head->next->exp=exp; head->next->next=NULL; } } return head;}Polynomial add(Polynomial poly1,Polynomial poly2){ //将poly1,poly2相加得到一个新多项式链表poly3 Polynomial p,q,r,poly=(Polynomial)malloc(LEN); //poly为和多项式链表的头节点 poly->next=NULL; r=poly; //r指向poly的最后一个节点 p=poly1->next; q=poly2->next; while(p&&q){ if(p->exp>q->exp){ r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=p->coef; r->exp=p->exp; p=p->next; } else if(p->exp
exp){ r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=q->coef; r->exp=q->exp; q=q->next; } else{ float m=p->coef+q->coef; if(!(m>-0.000001&&m<0.000001)){ r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=m; r->exp=p->exp; } p=p->next; q=q->next; } } while(p){ //若p中有剩余 r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=p->coef; r->exp=p->exp; p=p->next; } while(q){ //若q中有剩余 r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=q->coef; r->exp=q->exp; q=q->next; } r->next=NULL; return poly;}void polyAdd(Polynomial poly1,Polynomial poly2){ //把poly2加到poly1上,加完之后poly1为和多项式,poly2将被释放 Polynomial p,q,t; q=poly2->next; while(q){ p=poly1; while(p->next&&q->exp
next->exp) //找到要插入poly1的位置,插在p与p->next之间 p=p->next; if(p->next){ //插在poly1中间 if(q->exp==p->next->exp){ //若要插入节点的系数等于p->next的系数 float m=q->coef+p->next->coef; if(m>-0.000001&&m<0.000001){ Polynomial tmp1=p->next; p->next=tmp1->next; free(tmp1); } else{ p->next->coef=m; } } else{ Polynomial tmp2=(Polynomial)malloc(LEN); tmp2->coef=q->coef; tmp2->exp=q->exp; tmp2->next=p->next; p->next=tmp2; } } else{ //插在poly1末端 p->next=(Polynomial)malloc(LEN); p->next->coef=q->coef; p->next->exp=q->exp; p->next->next=NULL; } t=q; q=q->next; free(t); } free(poly2); //释放poly2的头节点}Polynomial multiply(Polynomial poly,float coef,int exp){ //多项式poly与单项coef^exp相乘,返回乘法之后的多项式链表 Polynomial p,r,head=(Polynomial)malloc(LEN); head->next=NULL; r=head; p=poly->next; while(p){ r->next=(Polynomial)malloc(LEN); r=r->next; r->coef=p->coef*coef; r->exp=p->exp+exp; p=p->next; } return head;}Polynomial polyMultiply(Polynomial poly1,Polynomial poly2){ //返回poly1*poly2的多项式链表 Polynomial p,poly=(Polynomial)malloc(LEN); //乘积多项式的头指针 poly->next=NULL; p=poly2->next; while(p){ polyAdd(poly,multiply(poly1,p->coef,p->exp)); //把poly1和poly2中的每一项相乘后求和 p=p->next; } return poly;}void print(Polynomial poly){ //输出链表的函数 if(poly&&poly->next){ Polynomial p=poly->next; while(p){ if(p->next==NULL){ //当p为最后一个节点时 if(p->exp!=0) printf("%fx^%d",p->coef,p->exp); else printf("%f",p->coef); } else{ printf("%fx^%d",p->coef,p->exp); if(p->next->coef>0) printf("+"); } p=p->next; } printf("\n"); } else printf("0.000000\n");}void clear(Polynomial poly){ //释放内存 if(poly&&poly->next){ Polynomial p,q; p=poly; while(p){ q=p->next; free(p); p=q; } } poly=NULL;}int main(){ Polynomial p1,p2,p3,p4; printf("Please input p1:\n"); p1=create(); printf("Please input p2:\n"); p2=create(); printf("p1="); print(p1); printf("p2="); print(p2); p3=add(p1,p2); //p3=p1+p2 printf("p3=p1+p2="); print(p3); p4=polyMultiply(p1,p2); //p4=p1*p2 printf("p4=p1*p2="); print(p4); clear(p1); //释放内存 clear(p2); clear(p3); clear(p4); return 0;}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10326092.html

你可能感兴趣的文章
国内开源镜像站
查看>>
vb.net中东软医保接口的调用
查看>>
java 消息摘要算法MD
查看>>
Web Service security UserNameToken 使用
查看>>
I/O重定向
查看>>
去除vue项目中的#及其ie9兼容性
查看>>
linux实例 批量修改图片文件名
查看>>
day15(mysql 的多表查询,事务)
查看>>
IOS
查看>>
beta冲刺第三天
查看>>
beta第二天
查看>>
工作中常用的但是又容易忽略的问题
查看>>
css特殊情况
查看>>
洛谷 P2735 电网 Electric Fences Label:计算几何--皮克定理
查看>>
Vue + webpack 项目配置化、接口请求统一管理
查看>>
关于电脑的基础单词笔记
查看>>
安卓App设计博文
查看>>
11.8 开课二个月零四天 (Jquery)
查看>>
ZEN CART 在LINUX系统下设置邮箱方法---用GMAIL设置,方法选择SMTPAUTH
查看>>
ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
查看>>