//实现多项式的运算 
#include<iostream>

using namespace std;

typedef struct PNode{
	float coef;			//系数 
	int expn;			//指数 
	struct PNode *next;
}PNode,*Polyn;

//创建多项式  实现链表递增 
void CreatePolyn(Polyn &L,int n)
{
	L=new PNode;		//创建带有头结点的空链表
	L->next=NULL;
	for(int i=0;i<n;i++)
	{
		Polyn s=new PNode;
		cout << "请输入第" << i+1 << "个系数和指数(中间用空格隔开):";
		cin >> s->coef >> s->expn;		
		PNode *pre,*q;
		pre=L;			//pre指向待找结点前驱 
		q=L->next;		//q指向待找结点 
		while(q&&q->expn < s->expn)
		{
			pre=q;
			q=q->next;
		}
		//然后把s插入到pre和q中间
		s->next=q;
		pre->next=s;
	}
}

//遍历取值 
void T_GetElem(Polyn L)
{
	PNode *p;
	p=L->next;
	while(p)
	{
		cout << p->coef << " " << p->expn << endl;
		p=p->next;
	}
}

//多项式相加
void AddPolyn(Polyn &A,Polyn &B)
{
	PNode *r;
	PNode *p1,*p2,*p3;
	p1=A->next;p2=B->next;
	p3=A;	
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sum=p1->coef+p2->coef;
			//如果和等于0  销毁p1 p2 
			//否则 销毁p2,改变p1的指数值 
			if(sum==0)
			{
				r=p1;p1=p1->next;delete r;
				r=p2;p2=p2->next;delete r;
			}
			else
			{
				p1->coef=sum;
				r=p2;p2=p2->next;delete r;
				//把p1链在p3之后,再更新p3 
				p3->next=p1;
				p3=p1;
				p1=p1->next;
			}
		}
		else if(p1->expn<p2->expn)
		{
			//链p1  p1指向下一个结点 
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		} 
		else
		{
			//链p2 
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	p3->next=p1?p1:p2;
	delete B;		//销毁B的表头 
} 

int main()
{
	Polyn PA,PB;
	int n;
	cout << "输入多项式 PA 的项数 :" ;
	cin >> n;
	CreatePolyn(PA,n);
	cout << "多项式PA的各个系数:\n";
	T_GetElem(PA);
	cout << "------------------------\n";
	cout << "输入多项式 PB 的项数 :" ;
	cin >> n;
	CreatePolyn(PB,n);
	cout << "多项式PB的各个系数:\n";
	T_GetElem(PB);
	cout << "------------------------\n";
	AddPolyn(PA,PB);
	cout << "相加后的各项:\n";
	T_GetElem(PA);
	return 0;
}

链表实现多项式的相加

相关文章: