您的位置:首页 > 其它

两个多项式的加法

2013-06-01 18:05 393 查看
原题:用链式存储结构存放一元多项式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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多项式 加法 算法