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

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值