您的位置:首页 > 其它

一元多项式相加,链表存储实现 ,不使用头结点

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: