两个多项式的加法

原题:用链式存储结构存放一元多项式Pn(x)=p(1) x e(1) + p(2) x e(2) + ... + p(n) x e(n),其中 p(i)是指数为 e(i) 项的非零系数,且满足 0 <= e(1) < e(2) <...< e(n)=n。请设计算法将多项式B=Pn2(x) 加到多项式 A=Pn1(x),同时对算法及链表的节点结构简单注释。要求利用 Pn1(x) 和Pn2(x)的节点产生最后求得的和多项式,不允许另建和多项式的节点空间。 分析:这本质上是将两个有序链表合并为一个新的有序链表,对于指数相同的项还要进行合并同类项,用 la 和 lb 分别指向多项式 A 和 B ,具体思路如下:

a.设 pa、pb指针分别指向 la 与 lb 的首元素结点, la 的头节点作为新多项式链表的表头结点,释放 lb 指向的节点所占用的空间。


b.进行循环比较执行:每次比较 pa 与 pb 所指项的指数域的值,取下值较小的结点合并到新多项式链表的表尾处;对于指数相同的项,将系数域相加,如果和为 0 ,删除 pa 和 pb 所指项,并使 pa 和pb后移;如果和不为零,则将 pa 所指项的系数域改为原 pa、pb 所指系数域之和,再将 pa 所指项合并到新多项式链表表尾处,删除 pb 所指项,再将 pa、pb 后移到原多项式中的后一项,直到有一个链表为空为止。


c.将 la、lb 中非空指针所指示的链表整体插入在循环链表的表尾。

#include<iostream.h>
#include<stdlib.h>
#include<time.h>

typedef struct PNode
{
	double coef;//系数
	int exp;//指数
	struct PNode *next;//指向下一结点的指针
}PNode,*Polynomial;

int static flag=0;

int CreatePoly(Polynomial &head)//自动生成随机的多项式
{
	int k,i;
	head=new PNode;
	head->next=NULL;head->coef=0;head->exp=0;//头结点系数和指数都为0
	Polynomial p,pre,lp;
	if(flag == 0)
	{
		srand((unsigned)time(NULL));flag=1;
	}
	k=rand()%12;
	for(i=0;i<3+k;i++)
	{
		p=new PNode;//生成新结点
		p->coef=(rand()%100)*3.14;
		p->exp=rand()%9;
		if(head->next == NULL)//生成第一个结点时直接链入表头
		{
			head->next=p;p->next=NULL;
		}
		else//生成后续结点并按指数从小到大的顺序插入链表
		{
			pre=head;lp=pre->next;
			while(lp != NULL && lp->exp < p->exp)//寻找插入位置
			{
				pre=lp;lp=lp->next;
			}
			//若表中已有指数相同的项,则不插入,直接进行下一次循环
			if((lp != NULL && p->exp == lp->exp) || pre->exp == p->exp || p->coef == 0)

continue;
			if(lp != NULL)
			{
				p->next=pre->next;pre->next=p;
			}
			else
			{
				pre->next=p;p->next=NULL;
			}
		}
	}
	return 1;
}

int DisplayPoly(Polynomial head)//打印出随机多项式
{
	Polynomial p=head;
	while(p->next !=NULL)
	{
		cout<<"("<<p->coef<<","<<p->exp<<")"<<" + ";
		p=p->next;
	}
	cout<<"("<<p->coef<<","<<p->exp<<")"<<endl<<endl;
	return 1;
}

int AddPolynomial(Polynomial &headla,Polynomial headlb)
{
	Polynomial pa,pb,r,nextpa,nextpb;
	pa=headla->next;pb=headlb->next;
	headla->next=NULL;//headla作为新多项式的头结点
	r=headla;delete headlb;//r永远指向新多项式链表的表尾
	while(pa&&pb)
	{
		if(pa->exp < pb->exp)
		{
			nextpa=pa->next;//nextpa指向pa所指结点的后继结点
			//将pa所指项插入到 r 的表尾处
			pa->next=r->next;r->next=pa;
			r=pa;// r 指向 la 的新表尾
			pa=nextpa;// pa 指向 pa 所指项在原多项式链表中的后继			
		}
		else if(pa->exp > pb->exp)
		{
			nextpb=pb->next;//nextpb指向pb所指结点的后继结点
			//将pb所指项插入到 r 的表尾处
			pb->next=r->next;r->next=pb;
			r=pb;// r 指向 la 的新表尾
			pb=nextpb;// pb 指向 pb 所指项在原多项式链表中的后继
		}
		else//合并同类项
		{
			double tempcoef;//同类项的系数之和
			nextpa=pa->next;nextpb=pb->next;
			tempcoef=pa->coef + pb->coef;
			if(tempcoef != 0)
			{//tempcoef即指数和不为0
				pa->coef=tempcoef;
				pa->next=r->next;r->next=pa;
				r=pa;// r 指向 headla 的新表尾
				pa=nextpa;// pa 指向 pa 所指项在原多项式链表中的后继
				delete pb;//删除 pb 所指的项
				pb=nextpb;// pb 指向 pb 所指项在原多项式链表中的后继
			}
			else
			{//tempcoef即指数和为0
				delete pa;pa=nextpa;
				delete pb;pb=nextpb;
			}
		}
	}
	while(pa)
	{//将原 headla 链表中剩余的结点插入到新链表中
		nextpa=pa->next;pa->next=r->next;
		r->next=pa;r=pa;pa=nextpa;
	}
	while(pb)
	{//将原 headlb 链表中剩余的结点插入到新链表中
		nextpb=pb->next;pb->next=r->next;
		r->next=pb;r=pb;pb=nextpb;
	}
	return 1;
}

int main()
{
	Polynomial headla,headlb;
	CreatePoly(headla);
	CreatePoly(headlb);
	cout<<"多项式headla的数据为:"<<endl;
	DisplayPoly(headla);
	cout<<"多项式headlb的数据为:"<<endl;
	DisplayPoly(headlb);
	AddPolynomial(headla,headlb);//将两多项式相加,新链表头结点为headla
	cout<<"两多项式相加的结果为:"<<endl;	
	DisplayPoly(headla);//这里的headla是新链表的头结点,不是旧链表的头结点
	return 1;
}

你可能感兴趣的:(算法,加法,多项式)