用单链表实现两个多项式相加(非原创,引用收集)

作者链接:单链表实现多项式相加_单链表实现多项式加法_玛丽莲茼蒿的博客-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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值