稀疏多项式的加法运算(C++)

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;
}

 运行结果图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值