#include <iostream>
using namespace std;
/*结点的定义*/
typedef struct LNode
{
float coef;
int exp;
struct LNode *next;
}LNode;
typedef LNode *Polynomial;
/*多项式的初始化*/
void initDuoX(Polynomial &Px)
{
Px=new LNode;
Px->next=NULL;
}
/*用正序插入法建立多项式*/
void creatDuoX(Polynomial &Px,int n)
{
initDuoX(Px);
LNode *p,*q;
p=Px;
for(int i=0;i<n;i++)
{
q=new LNode;
cin>>q->coef>>q->exp;
q->next=NULL;
p->next=q;
p=q;
}
}
/*求多项式的长度*/
int lengthDuoX(Polynomial &Px)
{
LNode *p;
int count;
p=Px->next;
count=0;
while(p!=NULL)
{
p=p->next;
count++;
}
return count;
}
/*输出多项式*/
void outputDuoX(Polynomial &Px)
{
LNode *p;
p=Px->next;
int i;
for(i=0;i<lengthDuoX(Px);i++)
{
cout<<p->coef<<" "<<p->exp<<" ";
p=p->next;
}
cout<<endl;
}
/*多项式相加*/
LNode * addDuoX(Polynomial &Pa,Polynomial &Pb)
{
LNode *p,*q;
LNode *prep;//prep指向p的前驱。
LNode *u;
p=Pa->next;
q=Pb->next;//p、q分别指向多项式的第一项。
prep=Pa;//因为是Pb加到Pa上,所以此处不需要使用q的前驱。
while (p&&q)
{
if(p->exp<q->exp)//第一种情况,指针只需后移。
{
prep=p;
p=p->next;
}
else if(p->exp > q->exp)//第二种情况,将q结点插入到p结点之前。
{
u=q->next;
q->next=p;
prep->next=q;
prep=q;
q=u;
}
else//第三种情况,系数进行相加。
{
p->coef=p->coef+q->coef;
if(p->coef==0)//系数相加等于0
{
LNode *temp1;
LNode *temp2;
temp1=p;
temp2=q;
prep->next=p->next;
p=p->next;
q=q->next;
delete temp1;//这里不能直接释放p结点。
delete temp2;
}
else
{
LNode *temp2;
temp2=q;
prep=p;
p=p->next;
q=q->next;
delete temp2;
}
}
}
if(q)
prep->next=q;
delete Pb;
return Pa;
}
void main()
{
Polynomial Pa,Pb,Pc;
creatDuoX(Pa,4);
creatDuoX(Pb,5);
Pc=addDuoX(Pa,Pb);
outputDuoX(Pc);
}
总体上来说,虽然是两个多项式相加,但两个多项式的地位是不一样的。是Pb加到Pa上,所以对两个多项式的处理也不一样。
虽然是照着算法写这个程序,可是还是费了老大的劲,才把它写出来,而且还出错了!经过调试之后,测试了一组数据,呵呵,正确!为确保万无一失,再测一组,呜呜,错了!所以写了程序,要多测几组数据 ,才能确保万无一失。
写这个程序没有学到多少新的东西,但是让我对单链表有了更深的理解,并且能够更加牢固的掌握它!嘿嘿,自己要加油啊!!!
写程序,写程序,乐在其中!!!
标签:单链,LNode,多项式,Px,C++,next,Pb,Pa From: https://blog.51cto.com/u_5173797/7252044