作者链接:单链表实现多项式相加_单链表实现多项式加法_玛丽莲茼蒿的博客-CSDN博客
(a)A(x) = 7 + 3x + 9x8 + 5x17 (b)B(x) = 8x + 22x7 − 9x8
a: (7, 0), (3, 1),(9, 8),(5, 17)
b: (8, 1), (22, 7),(-9, 8)
c: (7, 0), (11, 1),(22, 7), (5, 17)
C(x) = 7 + 11x + 22x7 + 5x17
#include<iostream>
using namespace std;
typedef struct PNode{
int exp; //定义指数;
int coef; //定义系数;
struct PNode *next; //定义指向下一个的指针;
}PNode,*Poly; //使用typedef关键字将PNode*重命名为Poly,以便于使用。
//创建链表;
void Creat(Poly &p){
//PNode被用于定义链表节点的数据类型,而Poly被用于定义链表的头指针类型。
p=new PNode;
p->next=NULL;
Poly pre=p; //Poly pre = p; 这行代码的作用是创建一个指针 pre,并将其初始化为链表的头指针 p。
int n;
cin>>n;
for(int i=1;i<=n;i++){
Poly s=new PNode; //Poly s = new PNode; 语句是用来创建一个新的节点,并将其地址赋值给指针变量 s。
cin>>s->coef>>s->exp;
s->next=NULL;
pre->next=s; //将s结点插入pre中;
pre=s;
}
//最终创建的链表是由p作为头节点开始构成的,最终创建的链表只有一个头结点;
}
//相加是以anow作为答案输出的,也就是说a=a+b,相加得到的答案是存储于anow链表里的;
void add(Poly &a,Poly &b){
Poly anow=a->next;
Poly apre=a; //apre的作用是在链表操作中起到辅助作用,帮助定位和操作当前节点的前一个节点。
Poly bnow=b->next;
while(anow!=NULL&&bnow!=NULL){
if(anow->exp==bnow->exp){
if(anow->coef+bnow->coef==0){
apre->next=anow->next; //将当前节点(anow)从链表中移除。通过将前一个节点的next指针链接到当前节点的下一个节点上,实现节点的跳过。
anow=apre->next;
bnow=bnow->next;
}else{
anow->coef=anow->coef+bnow->coef;
anow=anow->next;
bnow=bnow->next;
apre=apre->next;
}
}else if(anow->exp<bnow->exp){
anow=anow->next;
apre=apre->next;
}else{
Poly bnew=new PNode;
bnew->coef=bnow->coef;
bnew->exp=bnow->exp;
bnew->next=anow;
apre->next=bnew; //apre就是anow的前一个结点;
apre=apre->next;
bnow=bnow->next;
}
}
if(bnow!=NULL){
apre->next=bnow;
}
}
int main()
{
Poly heada,headb;
Creat(heada);
Creat(headb);
add(heada,headb);
Poly result=heada->next;
while(result!=NULL){
cout<<result->coef<<" "<<result->exp<<"\n";
result=result->next;
}
return 0;
}