数据结构(C语言)课设6——一元稀疏多项式的计算

数据结构(C语言)课设6——一元稀疏多项式的计算

题目描述:

能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;
#include <iostream>
using namespace std;
typedef struct PNode
{
    float coef;     //系数
    int expn;        //指数
    struct PNode *next;  //指针域
}PNode, *Polynomial;
void CreatePolyn(Polynomial &P, int n)//创建多项式
{
    P = new PNode;
    P->next = NULL;//首先建一个带头结点的空链表
    for(int i = 1; i <= n; ++i)
    {
        PNode *q, *pre, *s;
        s = new PNode;  //生成新结点
        cout<<"请输入第"<<i<<"项的系数和指数: ";
        cin>>s->coef>>s->expn;
        pre = P;      //pre用于保存q的前驱,初值为头结点
        q = P->next;
        while(q && q->expn < s->expn)//指数
        {
            pre = q;
            q = q->next;
        }
        s->next = q;
        pre->next = s;
    }
    cout<<"---------------------------------"<<endl;
    cout<<"您输入的多项式已经为您创建完毕: "<<endl;
    PNode *a = new PNode;
    a = P->next;
    for(int i = 1; i <= n; i++)
    {
        cout<<"创建好的第"<<i<<"项的系数和指数分别为: ";
        cout<<a->coef<<" "<<a->expn<<endl;
        a = a->next;
    }
}
void Polyn(Polynomial &Pa, Polynomial &Pb, char op)
{
    PNode *p1, *p2, *p3, *r;
    int sum;
    p1 = Pa->next; p2 = Pb->next;
    p3 = Pa;
    while(p1 && p2)
    {
        if(p1->expn == p2->expn)//指数
        {
            if(op == '+')
            {
                sum = p1->coef + p2->coef;
            }
            else if(op == '-')
            {
                sum = p1->coef - p2->coef;
            }
            if(sum != 0)
            {
                p1->coef = sum;//
                p3->next = p1;
                p3 = p1;
                p1 = p1->next;
                r = p2;         //删除p2指向的已经合并完的结点
                p2 = p2->next;
                delete r;
            }
            else
            {
                r = p1; p1 = p1->next; delete r;//若为0则都删除
                r = p2; p2 = p2->next; delete r;
            }
        }
        else if(p1->expn < p2->expn)
        {
            p3->next = p1;//p1小 则移动p1
            p3 = p1;
            p1 = p1->next;
        }
        else//p2小  移动p2
        {
            if(op == '-')
            {
                p2->coef = -(p2->coef);
                p3->next = p2;
                p3 = p2;
                p2 = p2->next;
            }
            else
            {
                p3->next = p2;
                p3 = p2;
                p2 = p2->next;
            }
        }
    }
    p3->next = p1?p1:p2;
    if(p2 != NULL && op == '-')
    {
            p2->coef = -(p2->coef);
            p3->next = p2;
            p3 = p2;
            p2 = p2->next;
    }
    delete Pb;//释放Pb头结点
    PNode *a = new PNode;
    a = Pa->next;
    int i = 0;
    while(a)
    {
        cout<<"经过运算后的第"<<++i<<"项的系数和指数分别为: ";
        cout<<a->coef<<" "<<a->expn<<endl;
        a = a->next;
    }
}
int main()
{
    Polynomial Pa, Pb;
    int n1, n2;
    char op;
    cout<<"***************第一个多项式******************"<<endl;
    cout<<"请输入第一个多项式 Pa 的项数: ";
    cin>>n1;
    CreatePolyn(Pa, n1);
    cout<<"***************第二个多项式******************"<<endl;
    cout<<"请输入第二个多项式 Pb 的项数: ";
    cin>>n2;
    CreatePolyn(Pb, n2);
    cout<<"请输入要进行的运算:(+或-)"<<endl;
    cin>>op;
    Polyn(Pa, Pb, op);
    return 0;
}

此博文只用于博主记录学习过程(有问题可以评论)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值