1、[多项式的创建算法步骤]
①创建一个只有头结点的空链表。
②根据多项式的项的个数n,循环n次执行以下操作:
●生成一个新结点*s;
●输人多项式当前项的系数和指数赋给新结点*s的数据域;
●设置一前驱指针pre,用于指向待找到的第-个大于输人项指数的结点的前驱,pre初值指向头结点;
●指针q初始化,指向首元结点;
●循链向下逐个比较链表中当前结点与输人项指数,找到第一一个大于输人项指数的结点*q;将输人●项结点*s插人到结点*q之前。
2、[多项式的相加算法步骤]
①指针p1和p2初始化,分别指向Pa和Pb的首元结点。
②p3指向和多项式的当前结点,初值为Pa的头结点。
③当指针pl和p2均未到达相应表尾时,则循环比较pl和p2所指结点对应的指数值(pl->expn与p2->expn),有下列3种情况:
●当p1->expn等于p2->expn时,则将两个结点中的系数相加,若和不为零,则修改p1所指结点的系数值,同时删除p2所指结点,若和为零,则删除pl和p2所指结点;
●当p1->expn 小于p2->expn时,则应摘取pl所指结点插人到“和多项式”链表中去;。当p1->expn 大于p2->expn时,则应摘取p2所指结点插人到“和多项式”链表中去。
④将非空多项式的剩余段插人到p3所指结点之后。
⑤释放Pb的头结点。
完整代码:
#include <iostream>
using namespace std;
typedef struct PoNode{ //定义单链表存储结构
float coef; //系数
int expn; //指数
struct PoNode *next; //指针域
}PoNode,*Polyn;
void CreatPolyn(Polyn &P, int m){ //创建多项式
Polyn s,pre,q;
P = new PoNode;
P->next = NULL;
for (int i = 0; i < m; i++) {
s = new PoNode;
cout<<"请输入第"<<i+1<<"项的系数和指数:";
cin>>s->coef>>s->expn;
pre = P;
q = P->next;
while (q && q->expn < s->expn){ //判断插入位置,找到第一个大于s的指数的项q
pre = q;
q = q->next;
}
s->next = q; //将s插到pre和q之间
pre->next = s;
}
}
void Add(Polyn &Pa,Polyn &Pb){ //加法运算
Polyn p1,p2,p3,r;
p1 = Pa->next;
p2 = Pb->next;
p3 = Pa;
while (p1 && p2){
if (p1->expn == p2->expn){ //判断指数是否相等
float sum = p1->coef + p2->coef; //系数相加
if (sum != 0){ //系数和不为0
p1->coef = sum; //将pa结点改为新系数
p3->next = p1; //p1链到p3后
p3 = p1; //p3后移
p1 = p1->next;
r = p2;
p2 = p2->next;
delete r;
} else{ //系数和为0
r = p1; p1 = p1->next; delete r;
r = p2; p2 = p2->next; delete r;
}
} else if(p1->expn < p2->expn){ //pa指数小于pb指数
p3->next = p1;
p3 = p1;
p1 = p1->next;
} else{ //pa指数大于pb指数
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1?p1:p2; //插入剩余项
delete Pb;
}
void Print(Polyn P){
Polyn q = P->next;
while (q){
cout<<q->coef<<"X^"<<q->expn<<"+";
q = q->next;
}
}
int main() {
Polyn pa,pb,pc;
int m,n;
cout<<"请输入第一个多项式的项数:";
cin>>m;
CreatPolyn(pa,m);
cout<<"多项式为:";
Print(pa);
cout<<endl<<"请输入第二个多项式的项数:";
cin>>n;
CreatPolyn(pb,n);
cout<<"多项式为:";
Print(pb);
Add(pa,pb);
cout<<endl<<"运算结果为:";
Print(pa);
return 0;
}
运行结果图: