虽然很简单,但是还是花了我2个多小时才完成,哎.........................
/*对于两个一元多项式所有指数相同的项,对应系数相加
若其和不为零,则作为和多项式的一项插入到和多项式链表中去
如指数不相同,则将指数数值较小的插入到和多项式链表中去
注意:多项式链表中的节点不需生成,而应该从两个多项式链表中摘取*/
#include <iostream>
using namespace std;
//******************多项式结构体*****************
typedef struct PNode
{
float coef; //系数
int expn; //指数
struct PNode* Next;
}PNode;
//******************初始化链表表头**************
void InitLink(PNode* &L)
{
L = new PNode;
L->expn = -1;
L->Next = NULL;
}
//******************多项式链表的创建*************
/*算法思想: 首先初始化一个空链表用来表示多项式,然后逐个输入各项
通过比较,找到第一个大于此项指数的项,把此项插入到第一个大于
此项的前面,这样保证多项式链表的有序性
*/
void CreatLinkList(PNode* L)
{
int numsItems = 1; //纪录项数
PNode* s;
PNode* pre;
PNode* p;
s = new PNode; //先生成一个节点
cout<<"输入数据,以系数和指数为-1结束输入:"<<endl;
cout<<"第"<<numsItems<<"项系数 and 指数:";
while(cin>>s->coef>>s->expn,s->coef != -1 && s->expn != -1)
{
pre = L; //pre指向要查的前一个节点
p = L->Next; //p指向要插入的后一个节点
while(p && p->expn < s->expn)
{
pre = p;
p = p->Next;
}
s->Next = p;
pre->Next = s;
numsItems++;
s = new PNode;
cout<<"第"<<numsItems<<"项系数 and 指数:";
}
}
//******************打印多项式链表****************
void PrintLink(PNode* L)
{
int numsItem = 1;
PNode* p;
p = L->Next;
while(p)
{
cout<<"第"<<numsItem<<"项系数:"<<p->coef<<" 指数:"<<p->expn<<endl;
numsItem++;
p = p->Next;
}
}
//******************两表求和**********************
void ADDLinkList(PNode* L1,PNode* L2)
{
PNode* p1 = L1->Next;
PNode* p2 = L2->Next;
//cout<<p1->expn<<" "<<p2->expn<<endl;
PNode* p3 = L1;
PNode* r;
int sum;
while(p1 && p2)
{
if(p1->expn == p2->expn)
{
sum = p1->coef + p2->coef;
cout<<sum<<endl;
if(sum!=0)
{
p1->coef = sum;
p3->Next = p1;
p3 = p1;
p1 = p1->Next;
r = p2;
p2 = p2->Next;
delete r;
}
else
{
r = p1;
p1 = p1->Next;
delete r;
r = p2;
p2 = p2->Next;
delete r;
}
}
else
if(p1->coef < p2->coef)
{
p3->Next = p1;
p3 = p1;
p1 = p1->Next;
}
else
{
p3->Next = p2;
p3 = p2;
p2 = p2->Next;
}
}
p3->Next = p1 ?p1:p2;
delete L2;
}
//******************主函数************************
int main()
{
PNode* L1;
PNode* L2;
InitLink(L1);
InitLink(L2);
cout<<"********************表一*********************"<<endl;
CreatLinkList(L1);
cout<<"********************表二*********************"<<endl;
CreatLinkList(L2);
cout<<"********************相加后*********************"<<endl;
ADDLinkList(L1,L2);
PrintLink(L1);
return 0;
}