一元多项式相加,链表存储实现 ,不使用头结点
2016-02-26 18:12
375 查看
#include <stdio.h> #include <stdlib.h> /* 一元多项式相加,链表存储实现 ,不使用头结点 */ typedef struct _Node{ struct _Node* link; int coefficient;//系数 int exponential;//指数 }Polynomial; //添加一个项,无需按指数大小顺序输入,指数相同的项可多次输入 Polynomial* attach(Polynomial* myPoly,int coef,int expon); //多项式相加 Polynomial* addPoly(Polynomial* poly1,Polynomial* poly2); //比较一个项的指数,第一个比第二个大,返回1,小返回-1,相等放回0 int comparePolyNode(Polynomial* polyNode1,Polynomial* polyNode2); int main() { Polynomial* myPoly=attach(NULL,1,1); myPoly=attach(myPoly,3,3); myPoly=attach(myPoly,2,2); myPoly=attach(myPoly,1,2); Polynomial* myPoly2=attach(NULL,1,1); myPoly2=attach(myPoly2,3,3); myPoly2=attach(myPoly2,2,2); myPoly2=attach(myPoly2,1,2); Polynomial* add=addPoly(myPoly,myPoly2); return 0; } //添加一个项 Polynomial* attach(Polynomial *myPoly,int coef,int expon) { Polynomial* polyTmp=(Polynomial*)malloc(sizeof(Polynomial)); polyTmp->coefficient=coef; polyTmp->exponential=expon; polyTmp->link=NULL; if(!myPoly){ myPoly=polyTmp; }else{ Polynomial* firstPoly=myPoly; Polynomial* lastPoly=myPoly; while(myPoly){ if(myPoly->exponential < expon){ //首位特殊处理 if(lastPoly == myPoly) { polyTmp->link=firstPoly; firstPoly=polyTmp; }else { polyTmp->link=myPoly; lastPoly->link=polyTmp; } break; }else if(myPoly->exponential == expon) { myPoly->coefficient=myPoly->coefficient+coef; break; } lastPoly=myPoly; myPoly=myPoly->link; } //把新的项的指数比原有的都大,则加到最后面 if(!myPoly) { lastPoly->link=polyTmp; } myPoly=firstPoly; } return myPoly; } int comparePolyNode(Polynomial* polyNode1,Polynomial* polyNode2) { int res=polyNode1->exponential-polyNode1->exponential; if(res > 0) { return 1; }else if(res<0) { return -1; }else { return 0; } } //多项式相加 Polynomial* addPoly(Polynomial* poly1,Polynomial* poly2) { Polynomial* polyTmp=NULL; Polynomial *p1=poly1,*p2=poly2; while(p1 && p2){ int compRes=comparePolyNode(p1,p2); switch(compRes) { case 1: polyTmp=attach(polyTmp,p1->coefficient,p1->exponential); p1=p1->link; break; case -1: polyTmp=attach(polyTmp,p2->coefficient,p2->exponential); p2=p2->link; break; case 0: if(p1->coefficient+p2->coefficient) { polyTmp=attach(polyTmp,p1->coefficient+p2->coefficient,p1->exponential); } p1=p1->link; p2=p2->link; break; } } while(p2) { polyTmp=attach(polyTmp,p2->coefficient,p2->exponential); p2=p2->link; } while(p1) { polyTmp=attach(polyTmp,p1->coefficient,p1->exponential); p1=p1->link; } return polyTmp; }
相关文章推荐
- MySQL笔记——主键使用的好习惯
- 从瀑布开发模式到敏捷开发模式(scrum)的思路转换
- TreeSet的使用方法和案例详解
- Espresso ui单元测试框架初探
- MySQL笔记——主键使用的好习惯
- 多文件上传插件
- Java、Scala、C#泛型中的协变和逆变
- Android启动过程分析——init.c(二)
- 读《解忧杂货店》
- 深入理解HTTP协议
- 百度联想
- javascript svg 页面 loading
- JavaScript跨域总结与解决办法(转)
- struts2传值
- On Demand Resources
- openwrt tftp 烧录openwrt-ramips-mt7628-mt7628-squashfs-sysupgrade.bin
- TCP的状态和三次握手
- 马拉车求最大回文字串
- Ubuntu 12.04下GAMIT10.40安装说明
- web端输出打印地图(ArcGIS api for Javascript)一、地图打印模板的制作