线性表在一元多项式运算中的应用

实验题1-1 多项式运算

【问题描述】有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积。

【提示】 用带表头结点的单链表作为多项式的存储表示;要建立两个单链表;多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入、删除操作中指针的正确修改。

 

#include <iostream>
using namespace std;

int k = 1;
typedef struct {
    float coef;  //系数
    int expn;   //指数
}term;

struct LNode{
    term data;
    struct LNode *next;
};

typedef struct LNode* Polynomial;

//合并同类项
Polynomial MergePolyn(Polynomial P)
{
    Polynomial p = NULL,q = NULL,r = NULL,Q = NULL;
    if(P == NULL||P->next == NULL){
        return NULL;
    }
    else{
        for(p = P->next;p!=NULL;p=p->next)
            for(q = p->next,r = p;q!=NULL;){
                if(p->data.expn == q->data.expn){
                    p->data.coef+=q->data.coef;
                    Q = q;
                    r->next = q->next;
                    q = r->next;//?至关重要
                    delete Q;
                }
                else
                    r=r->next,q = q->next;
            }
        return P;
    }
}

//1.创建一个一元多项式
Polynomial CreatePolyn(int m)
{
    if(m>=0){
        Polynomial head = new LNode;
        head->next = NULL;
        Polynomial s,r = head;
        for(int i=0;i<m;i++){
            cout<<"第"<<i+1<<"项的系数和指数是:";
            float c;
            int e;
            cin>>c>>e;
            s = new LNode;
            s->next = NULL;
            s->data.coef = c;
            s->data.expn = e;
            r->next = s;
            r = r->next;
        }
        r->next = NULL;
        return head;
    }
    else{
        cout<<"输入m值非法,创建多项式失败\n";
        k = 0;
        return NULL;
    }
}

//2.两个一元多项式相加
Polynomial AddPolyn(const Polynomial pa,const Polynomial pb)
{
    if(pa&&pa->next&&pb&&pb->next){
        Polynomial head = new LNode;
        Polynomial s = pa->next,t = pb->next,r = head;
        r->next = NULL;
        while(s!=NULL){
            Polynomial n = new LNode;
            n->next = NULL;
            n->data.coef = s->data.coef;
            n->data.expn = s->data.expn;
            r->next = n;
            r = r->next;
            s = s->next;
        }
        while(t!=NULL){
            Polynomial n = new LNode;
            n->next = NULL;
            n->data.coef = t->data.coef;
            n->data.expn = t->data.expn;
            r->next = n;
            r = r->next;
            t = t->next;
        }
        r->next = NULL;
        head = MergePolyn(head);
        return head;

    }
    else if((pa == NULL||pa->next == NULL)&&(pb!=NULL&&pb->next!=NULL))
        return pb;
    else if((pb == NULL||pb->next == NULL)&&(pa!=NULL&&pa->next!=NULL))
        return pa;
    else
        return NULL;
}

//3.两个一元多项式相乘
Polynomial MultiplyPolyn(const Polynomial pa,const Polynomial pb)
{
   if(pa==NULL||pa->next==NULL||pb==NULL||pb->next==NULL)
        return NULL;
    else{
        Polynomial head = new LNode;
        head->next = NULL;
        Polynomial p,q,r,s = head;
        for(p = pa->next;p!=NULL;p=p->next)
            for(q = pb->next;q!=NULL;q=q->next){
                r = new LNode;
                r->data.coef = p->data.coef * q->data.coef;
                r->data.expn = p->data.expn + q->data.expn;
                r->next = NULL;//千万记住将new的结点指针域置空
                s->next = r;
                s = s->next;
            }
        s->next = NULL;
        head = MergePolyn(head);
        return head;
    }
}

//打印多项式
void PrintPolyn(Polynomial P)
{
    if(P==NULL||P->next==NULL){
        cout<<"无项\n";
    }
    else{
        cout<<"Y=";
        int iszero = 1;
        Polynomial p = NULL,q = NULL;
        p = P->next;
        if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn&&p->data.expn!=1)
            {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==1)
            {cout<<p->data.coef<<"X";iszero = 0;}
        else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==0)
            {cout<<p->data.coef;iszero = 0;}
        else if(p->data.coef==1&&p->data.expn&&p->data.expn!=1)
            {cout<<"X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef==1&&p->data.expn==1)
            {cout<<"X";iszero = 0;}
        else if(p->data.coef==1&&p->data.expn==0)
            {cout<<"1";iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn&&p->data.expn!=1)
            {cout<<"-X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn==1)
            {cout<<"-X";iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn==0)
            {cout<<"-1";iszero = 0;}
        else if(p->data.coef==0)
            ;
        else
            {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
        if(p->next)
            q = p->next;
        while(q){
            if(q->data.coef>0&&q->data.coef!=1&&q->data.expn&&q->data.expn!=1)
                {cout<<"+"<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef>0&&q->data.expn==0)
                {cout<<"+"<<q->data.coef;iszero = 0;}
            else if(q->data.coef>0&&q->data.coef!=1&&q->data.expn==1)
                {cout<<"+"<<q->data.coef<<"X";iszero = 0;}
            else if(q->data.coef==1&&q->data.expn&&q->data.expn!=1)
                {cout<<"+"<<"X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef==1&&q->data.expn==1)
                {cout<<"+"<<"X";iszero = 0;}
            else if(q->data.coef==1&&q->data.expn==0)
                {cout<<"1";iszero = 0;}
            else if(q->data.coef<0&&q->data.coef!=-1&&q->data.expn==1)
                {cout<<q->data.coef<<"X";iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn&&q->data.expn!=1)
                {cout<<"-X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn==1)
                {cout<<"-X";iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn==0)
                {cout<<"-1";iszero = 0;}
            else if(q->data.coef==0)
                ;
            else
                {cout<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
            q=q->next;
        }
        if(iszero)
            cout<<"0";
        cout<<endl;
    }
}

int main()
{
    Polynomial pa = NULL,pb = NULL,P = NULL,Q = NULL,R = NULL,T = NULL;
    do{
        cout<<"1.创建两个一元多项式"<<endl;
        cout<<"2.两个一元多项式相加得一新多项式"<<endl;
        cout<<"3.两个一元多项式相乘得一新多项式"<<endl;
        cout<<"请选择:";
        int n,m;
        cin >> n;
        switch(n)
        {
            case 1:
                cout<<"请输入第一个多项式的项数:";
                cin>>m;
                P = CreatePolyn(m);
                pa = MergePolyn(P);
                PrintPolyn(pa);
                cout<<"请输入第二个多项式的项数:";
                cin>>m;
                Q = CreatePolyn(m);
                pb = MergePolyn(Q);
                PrintPolyn(pb);
                break;
            case 2:
                R = AddPolyn(pa,pb);
                PrintPolyn(R);
                break;
            case 3:
                T = MultiplyPolyn(pa,pb);
                PrintPolyn(T);
                break;
            default:
                k = 0;
                cout<<"输入了无效字符\n";
                break;
        }
    }while(k);
    return 0;
}

 注意点:不能随意修改pa,pb的值,两多项式的加法运算与乘法运算应该互不干扰,尤其注意在多项式加法中不能采用两链表合为一个链表的算法(会改变pa的链表)。

P.S 对每一个new的结点的指针域要置空,同理,对每一个delete后的悬垂指针也应置空,否则后面的程序使用的时候以为还是没释放的对象, 访问就会出错。

转载于:https://www.cnblogs.com/socrates-lzstu/p/5369322.html

实验一 线性表及其应用 一、 实验目的和要求 1、掌握线性表的插入、删除、查找等基本操作设计与实现 2、学习利用线性表提供的接口去求解实际问题 3、熟悉线性表的的存储方法 二、 实验内容和原理 1、实验内容:设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。可利用单链表或单循环链表实现之。 2、实验原理:以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式某一项的系数和指数,建立单链表时指数高的结点列于指数低的 结点之后,即线性表的元素按指数递增有序排列。 三、 实验环境 Visual C++ 6.0 及PC机 四、 算法描述及实验步骤 思想算法: 以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。 例如构造两个多项式ha: 5X3+4X2+3X+2 hb: X2+X+1 多项式加法:定义指针p,q分别指向ha,hb i.p->exp==q->exp ,r->coef=p->coef+q->coef,pa,pb下移; ii.p->expexp ,r->coef=q->coef;r->exp=q->exp;,q下移 iii.pa->exp>pb->exp, r->exp=p->exp;r->coef=p->coef;,p下移 iv.p!=NULL,pb==NULL.相当于iii. V.q==NULL,pb!=NULL.相当于ii. 其流程图如下: 多项式乘法:定义指针fp,gp分别指向f,g 1.将多项式最大指数相加并赋于maxp,并置g 2.用for循环求指数等于maxp时相乘的系数 3. (fp!=NULL)&&(gp!=NULL), p=fp->exp+gp->exp 1.p>maxp, fp=fp->next; 2. pnext; 3.p=maxp, x+=fp->coef*gp->coef; fp=fp->next;gp=gp->next; 五、 实验结果 1.分别输入两个多项式: 5X3+4X2+3X+2 和X2+X+1,然后输出结果如下: 2.分别输入两个多项式:6X4+4X2+2和5X+6,然后输出结果如下: 六、 总结 此次上机实验应用线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了书本的算法思想,对我以后的编译以及完成新的程序有很大的帮助。 附录: 1.建立多项式列表代码如下: mulpoly *creatpoly()/*建立多项式列表*/ {mulpoly *head,*r,*s;/*设间变量*/ int m,n; head=(mulpoly *)malloc(sizeof(mulpoly));/*头结点申请空间*/ printf("\ninput coef and exp:\n"); scanf("%d%d",&n,&m);/*输入多项式系数和指数*/ r=head;/*尾指针指向头指针*/ while(n!=0)/*将输入的多项式存放在S*/ {s=(mulpoly*)malloc(sizeof(mulpoly)); s->coef=n; s->exp=m; r->next=s; r=s; /*printf("input coef and exp:\n");*/ scanf("%d%d",&n,&m);/*再次输入多项式系数和指数*/ } r->next=NULL;/*将尾指针置空*/ head=head->next;/*将head哑结点向前跑一个结点,使其不为空*/ return (head);/*返回多项式*/ } 2.两个多项式相加代码如下: mulpoly *polyadd(mulpoly *ha,mulpoly *hb)/*两个多项式相加*/ {mulpoly *hc,*p,*q,*s,*r;/*声明结构体型*/ int x; p=ha; q=hb; hc=(mulpoly *)malloc(sizeof(mulpoly));/*申请结点空间*/ s=hc; while((p!=NULL)&&(q!=NULL))/*多项式不为空*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值