ORIGIN全文地址:一元多项式的加法、减法、乘法和微分运算的C语言链表结构算法实现推荐:编程鼠标·电竞鼠标利用链表实现一元多项式的数学运算。如一元多项式可以利用其系数p和指数e组合的方式实现链式存储。通过对线性表的基本操作,例如插入,删除,查找等可以实现一元多项式的复杂运算,比如加,减,乘,除等运算。基本要求利用链表存储一元多项式,通过对链表的操作实现多项式的运算。测试数据对于多项式:A(x) = 7 + 3x + 9x + 5x,B(x) = 8x + 22x − 9x,实现加,减,乘和微分,输出结果。解答:实现思路代码结构为主分形式,主函数主要为一些提示,具体的输入输出则将参数传递到分函数中实现。分函数有创建一元多项式、多项式升幂排序、比较项指数大小、打印多项式、加法运算、减法运算、微分运算和乘法运算等。比较需要关注的是乘法方面的实现,思路是将乘法运算分解为一系列的加法运算。不过在这里着实纠结了好多天,本来呢觉得实现乘法自己应该为它再另外构造一个加法算法提供接口,以便实现它的加法迭代。可是呢,这样完全行不通,打印出来的都是0.0,自己完全不晓得为什么,重复对着代码思考了好多次了,觉得没什么毛病,但就是行不通——然后呢,大概是前天吧!自己捣弄了半天代码调试依旧不会的情况下,决定回归输出调试,于是就在乘法函数里注释掉了迭代用的加法,另外在加法循环体外面上头加了两句打印语句想看看多项式A和多项式B的每一项相乘后得到的结果是咋样的。于是乎奇迹就诞生了,用x1+2x2+3x3和x1作为测试数据,莫名其妙地乘法结果就给打印出来了,完全没有用到我费了九牛二虎之力写出来的迭代加法——不过显示结果还是有点小bug,显示出来的是正确结果的相反数,而且主函数返回值也不是正常的0,而是莫名其妙的3221225477接着本着修bug的精神就在乘法函数里运算部分乘了个负一,这下结果就好看了,如下(返回值依旧不正常)但是,天下怎么会有凭空掉馅饼这等好事!?自己再用上面给出的复杂测试数据跑了下,这下就没那么好看了,得出来的是一个明显错误的结果而且也发现了微分算法部分的一个小bug——好吧,只能后续继续改进了,自己应该是在指针理解上出现了问题,回头去《深入理解C指针》。另外,假如用户输入的两个一元多项式为相同的话,输出也会有点不正常,需要弄弄。看来有点眉目了11.25这天晚上,我终于弄明白了bug的缘由——丫蛋自己没把Pd给初始化!,而且打印函数如果给它的参数是个空地址的话,它会在那儿瞎转悠几圈,然后返回个不是0的返回值,直接结束程序——(还修复了打印首项有时会出现加号的小bug)还存在一个问题,就是如果输入的两个多项式是相同的话,减法那部分结果会不显示任何值,而不是0。得弄弄(已解决)OK,下面就贴下自己的代码了,折腾带注释版本,以及去掉无关注释~纯净版本实现代码(折腾注释版):#includestdio.h#includestdlib.htypedefstructterm{floatcoef;intexpn;structterm*next;}term,*LinkList;typedefLinkList polynomial;intcmp(LinkList pa,LinkList pb)//比较各项指数大小{if(pa-expnpb-expn)return1;elseif(pa-expn==pb-expn)return0;elsereturn-1;}intLocateElem(LinkList L,LinkList t,LinkList*q)/*定位项数指数大小,使多项式按升幂排序 这里的*q起到内存保护的作用*/{LinkList p1=L-next;LinkList p2=L;while(p1){if(t-expnp1-expn){p1=p1-next;p2=p2-next;}elseif(t-expn==p1-expn){*q=p1;return1;}else{*q=p2;return0;}}*q=p2;return0;}voidCreatePolyn(polynomial P)//建立多项式所需的各项具体值{LinkList t;LinkList q;P-coef=0.0;P-expn=-1;P-next=NULL;printf("Please input coefficient and exponent below in format like 1,2 and end with 0,0:\n");t=(LinkList)malloc(sizeof(term));// if(!t) exit(OVERFLOW); //借鉴教材《数据结构(C语言版)》的代码风格...没用t-next=NULL;scanf("%f,%d",t-coef,t-expn);while(t-coef||t-expn)//约定0,0结束输入,实现动态输入多项式{if(!LocateElem(P,t,q))/*每次输入的指数都应不同,转移指针P-q,而且实现指数排序(这里 q 博大精深, 利用指针的指针之妙法确保指针不被篡改,在LocateElem内部又机智地取回———)*/{t-next=q-next;/*1.q-next = NULL,2.q-next = t, 也改变了P-next的值 P与q共享内存*/q-next=t;//对t, 头插法, 对q, 尾插法}t=(LinkList)malloc(sizeof(term));// if(!t) exit(OVERFLOW);t-next=NULL;scanf("%f,%d",t-coef,t-expn);}}voidprintPolyn(polynomial P)//打印多项式{LinkList q;q=P-next;if(!q){printf("0\n");//针对两多项式相同的情况}while(q){if(q-coef==0)/*主要针对微分的常数项情况,可是出现了下一项变为首项但其前面加号没有去掉的情况。。。*/{printf("");q=q-next;/*将此if结构与下面if结构分开,不耦合,解决打印首项带加号问题*/}if(q-expn==0)//判断指数是否为零及正负,调整输出格式{printf("%.2f",q-coef);q=q-next;}elseif(q-expn0){printf("%.2f*x^%d",q-coef,q-expn);q=q-next;}else{printf("%.2f*x^(%d)",q-coef,q-expn);q=q-next;}if(q)//判断下一项系数正负,调整输出格式{if(q-coef0)printf("+");elseprintf("");}elseprintf("\n");}}voidAddPolyn(polynomial Pa,polynomial Pb,polynomial Pc)/*不完全参照教科书上的思路,而是另外开辟空间存储和,不释放原来数据空间*/{LinkList qa=Pa-next;LinkList qb=Pb-next;LinkList qc=Pc;LinkList head=qc;LinkList s;floatsum;Pc-coef=0.0;Pc-expn=-1;Pc-next=NULL;while(qaqb){switch(cmp(qa,qb)){case-1:s=(LinkList)malloc(sizeof(term));//if(!s) exit(OVERFLOW);*s=*qa;qc-next=s;qc=s;qa=qa-next;break;case0:sum=qa-coef+qb-coef;if(sum!=0.0){s=(LinkList)malloc(sizeof(term));//if(!s) exit(OVERFLOW);*s=*qa;s-coef=sum;qc-next=s;qc=s;qa=qa-next