数据结构课设——一元稀疏多项式的计算(单链表的应用)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DEAR_CXN/article/details/86556090

问题描述

能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;

算法思想

       构建一个式子的结构体,包括系数,指数和指针域。分别输入各项的系数和指数,按照指数降序的方式存入到结构体链表中;输出多项式时,多项式为0,系数为1或是负数和指数为0或1,还有是否是最后一个式子的情况,都需要分别讨论;多项式相加即是若指数相等,则系数直接相加,不等则考虑将指数较大的一个式子存入和链表中。多项式相减与相加方法类似,但是要考虑指数较大的式子是被减数还是减数来决定是加号还是减号。

算法设计

1、菜单显示void menu()——供用户选择的功能菜单。

2、输出多项式void PrintfPolyn(Polynimial P)——输出多项式时,多项式为0,系数为1或是负数和指数为0或1,还有是否是最后一个式子的情况,都需要分别讨论。

3、建立多项式void CreatePolyn(Polynimial &P)——分别输入各项的系数和指数,按照指数降序的方式存入到结构体链表中。

4、多项式相加void AddPolyn(Polynimial P1,Polynimial P2)——则系数直接相加,不等则考虑将指数较大的一个式子存入和链表中。

5、多项式相减void MinusPolyn(Polynimial P1,Polynimial P2)——多项式相减与相加方法类似,但是要考虑指数较大的式子是被减数还是减数来决定是加号还是减号。

6、主函数int main()——使用while循环和switch对功能进行调用,使用清屏函数,使界面更美观。

代码实现

#include<stdio.h>//一元稀疏多项式的计算
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct PNode
{
    float coef;//系数
    int expn;//指数
    struct PNode *next;//指针域
}PNode,*Polynimial;
void menu(){
    cout<<"***************一元稀疏多项式的计算***************"<<endl;
    cout<<"               1、建立并输出多项式"<<endl;
    cout<<"               2、多项式相加"<<endl;
    cout<<"               3、多项式相减"<<endl;
    cout<<"               4、退出"<<endl;
    cout<<"**************************************************"<<endl;
    cout<<"请选择..."<<endl;
}
void PrintfPolyn(Polynimial P){//输出多项式
    Polynimial t;
    t=P->next;
    if(t==NULL)
    {
        cout<<"0"<<endl;
        return;
    }
    while(t->next){
        if(t->expn!=0)
        {
            if(t->coef!=1&&t->coef!=-1)
                cout<<t->coef<<"x";
            else if(t->coef==1)
                cout<<"x";
            else
                cout<<"-x";
            if(t->next->coef>0)
                cout<<"^"<<t->expn<<"+";
            else
                cout<<"^";
        }
        else
            cout<<t->coef;
        t=t->next;
    }
   if(t->expn!=0)
        {
            if(t->coef!=1&&t->coef!=-1)
                cout<<t->coef<<"x";
            else if(t->coef==1)
                cout<<"x";
            else
                cout<<"-x";
            if(t->expn!=1)
                cout<<"^"<<t->expn;
        }
    else
        cout<<t->coef;
    cout<<endl;
}
void CreatePolyn(Polynimial &P){//建立多项式
    P=new PNode;
    P->next=NULL;
    cout<<"该多项式的项数为:";
    int n;
    scanf("%d",&n);
    cout<<"请依次输入各项的系数及指数(中间用空格隔开)"<<endl;
    for(int i=1;i<=n;++i){
        Polynimial s=new PNode;
        cin>>s->coef>>s->expn;
        Polynimial pre=P;
        Polynimial q=P->next;
        while(q&&q->expn>s->expn){
            pre=q;
            q=q->next;
        }
        s->next=q;
        pre->next=s;
    }
}
void AddPolyn(Polynimial P1,Polynimial P2){//多项式相加
    Polynimial pa,pb,pc;
    pa=P1->next;
    pb=P2->next;
    pc=P1;
    while(pa&&pb){
        if(pa->expn==pb->expn)
        {
            int sum=pa->coef+pb->coef;
            if(sum!=0){
                pa->coef=sum;
                pc->next=pa;
                pc=pa;
                pa=pa->next;
                Polynimial r=pb;
                pb=pb->next;
                delete r;
            }
            else
            {
                Polynimial r;
                r=pa;pa=pa->next;delete r;
                r=pb;pb=pb->next;delete r;
            }
        }
        else if(pa->expn>pb->expn){
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;
    delete P2;
    cout<<"多项式之和为:";
    PrintfPolyn(P1);
}
void MinusPolyn(Polynimial P1,Polynimial P2){//多项式相减
    Polynimial pa,pb,pc;
    pa=P1->next;
    pb=P2->next;
    pc=P1;
    while(pa&&pb){
        if(pa->expn==pb->expn)
        {
            int sum=pa->coef-pb->coef;
            if(sum!=0){
                pa->coef=sum;
                pc->next=pa;
                pc=pa;
                pa=pa->next;
                Polynimial r=pb;
                pb=pb->next;
                delete r;
            }
            else
            {
                Polynimial r;
                r=pa;pa=pa->next;delete r;
                r=pb;pb=pb->next;delete r;
            }
        }
        else if(pa->expn>pb->expn){
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else
        {
            pc->next=pb;
            pc=pb;
            pc->coef=-pc->coef;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;
    delete P2;
    cout<<"多项式之差为:";
    PrintfPolyn(P1);
}
int main(){
    Polynimial P1,P2;
    int m;
    while(m!=4){
        menu();
        cin>>m;
        switch(m){
        case 1:
             CreatePolyn(P1);
             PrintfPolyn(P1);
             break;
        case 2:
             cout<<"请按要求输入要计算的两个多项式:"<<endl;
             CreatePolyn(P1);
             CreatePolyn(P2);
             AddPolyn(P1,P2);
             break;
        case 3:
             cout<<"请按要求输入要计算的两个多项式:"<<endl;
             CreatePolyn(P1);
             CreatePolyn(P2);
             MinusPolyn(P1,P2);
             break;
        case 4:
            cout<<"感谢使用!"<<endl;
            break;
        default:
            cout<<"没有该选项!"<<endl;
            break;
        }
        system("pause");
        system("cls");
    }
    return 0;
}
展开阅读全文

一元稀疏多项式的问题

03-08

那个这是一道用单链表实现一元稀疏多项式的代码,在执行(x^1+x^2+x^3)+0时总是出现Access Violation,不知为什么?rn特此求教,不甚感激rn#includernusing namespace std;rn rntypedef struct DXS //定义一个多项式的结构体rn double c,e; //c,e分别为系数和指数rn int flag; //标记rn struct DXS *next;rnDXS;rnrnvoid out(DXS *l,DXS *head,int a) //输出函数,参数为结点、头指针、多项式项数rnrn if(a==0) //如果项数为0,则多项式为0rn cout<<0;rn for(int m=1;m<=a;m++)rn rn if(l->e==1)rn rn if(l==head) //分析第一个结点rn rn if( l->flag==-1) //输出几个特殊的系数rn l=l->next;rn else if(l->c==0) rn cout<c;l=l->next;rn else if(l->e==0)rn cout<c;l=l->next;rn else if(l->c==1)rn cout<<"x";l=l->next;rn else if(l->c==-1)rn cout<<"-x";l=l->next;rn else cout<c<<"x";l=l->next;rn rn else //分析第一个之后的结点rn rn if( l->flag==-1) //输出几个特殊结点rn l=l->next;rn else if(l->c==0) rn l=l->next;rn else if(l->e==0)rn rn if(l->c>0)cout<<"+"<c;l=l->next;rn else cout<c;l=l->next;rn rn else if(l->c==1) rn cout<<"+x^";l=l->next;rn else if(l->c==-1)rn cout<<"-x";l=l->next;rn else if(l->c>0)rn cout<<"+"<c<<"x";l=l->next;rn else if(l->c<0)rn cout<c<<"x";l=l->next; rn rn rn elsern rn if(l==head) //分析第一个结点rn rn if( l->flag==-1) //输出几个特殊的系数rn l=l->next;rn else if(l->c==0) rn cout<c;l=l->next;rn else if(l->e==0)rn cout<c;l=l->next;rn else if(l->c==1)rn cout<<"x^"<e;l=l->next;rn else if(l->c==-1)rn cout<<"-x^"<e;l=l->next;rn else cout<c<<"x^"<e;l=l->next;rn rn else //分析第一个之后的结点rn rn if( l->flag==-1) //输出几个特殊结点rn l=l->next;rn else if(l->c==0) rn l=l->next;rn else if(l->e==0)rn rn if(l->c>0)cout<<"+"<c;l=l->next;rn else cout<c;l=l->next;rn rn else if(l->c==1) rn cout<<"+x^"<e;l=l->next;rn else if(l->c==-1)rn cout<<"-x^"<e;l=l->next;rn else if(l->c>0)rn cout<<"+"<c<<"x^"<e;l=l->next;rn else if(l->c<0)rn cout<c<<"x^"<e;l=l->next; rn rn rn rnrnrnvoid down(DXS *l1,DXS *l2,int b) //多项式指数降序排列函数rnrn double f,g;rn for(int c=b;c>1;c--)rn for(int d=1;denext->e)rn rn f=l1->e;l1->e=l1->next->e;l1->next->e=f;rn g=l1->c;l1->c=l1->next->c;l1->next->c=g;rn rn l1=l1->next;rn rn l1=l2;rn rnrnrnvoid up(DXS *l1,DXS *l2,int b) //多项式指数升序排列函数rnrn double f,g;rn for(int c=b;c>1;c--)rn for(int d=1;de>l1->next->e)rn rn f=l1->e;l1->e=l1->next->e;l1->next->e=f;rn g=l1->c;l1->c=l1->next->c;l1->next->c=g;rn rn l1=l1->next;rn rn l1=l2;rn rnrnrnrnint arrange(DXS *s,DXS *head,int &b) //检测多项式中有没有相同项,若有,则合并为一项rnrn for(int c=b;c>1;c--)rn rn if(s->e==s->next->e)rn rn s->next->c = s->c + s->next->c;rn s->flag=-1;rn if(s->next->c==0)rn b--;rn b--;rn rn s=s->next;rn rn return b;rnrnrnint main()rnrn DXS *pa,*pb,*pc; //定义三个多项式的结点rn DXS *la,*lb,*lc; //定义三个多项式的头指针rn DXS *p,*q,*s; rn int n1,n2,n3,na,nb,nc; //多项式项数rn int i,j=0;rn char Q,Y;rn while(1)rn la=pa=new DXS; //为多项式A,B结点分配空间,并指向头指针rn lb=pb=new DXS;rnrn cout<<"请输入多项式A的项数(多项式为0,则算一项):";rn cin>>n1;rn na=n1; //保存第一条多项式的项数rn cout<<"请输入A的数据(按升序输入:第一项系数,第一项指数,第二项系数,第二项指数.....若为0,则输入0 0):"<>pa->c>>pa->e;rn p=pa; rn pa=new DXS; rn p->next=pa;rn rn rn cout<>n2;rn nb=n2; //保存第二条多项式的项数rn cout<<"请输入B的数据(按升序输入:第一项系数,第一项指数,第二项系数,第二项指数.....若为0,则输入0 0):"<>pb->c>>pb->e;rn q=pb; rn pb=new DXS; rn q->next=pb; rn rnrn pa=la; //重新指向头指针rn pb=lb;rnrn cout<>Q;rn cout<<"希望降序还是升序排列(S:升序/J:降序):"; rn cin>>Y;rn rn cout<c=(-1)*pb->c;rn pb=pb->next;rn rn pb=lb;rn rn else ; rn rn lc=pc=new DXS; //为多项式C结点分配空间,并指向头指针 rn rn if(n1==1&&la->c==0) //关于有多项式为0的处理rn n1--;rn else if(n2==1&&lb->c==0)rn n2--;rn rn while(n1>0&&n2>0) //两个不为0的多项式的运算,结果放到C中rn rn if(pa->e>pb->e)rn rn pc->c=pb->c;rn pc->e=pb->e;rn pb=pb->next;rn pc->flag=0;rn s=pc; rn pc=new DXS; //重新分配结点空间rn s->next=pc; rn j++;rn n2--;rn rn else if(pa->ee)rn rn pc->c=pa->c;rn pc->e=pa->e;rn pa=pa->next;rn pc->flag=0;rn s=pc; rn pc=new DXS; rn s->next=pc; rn j++;rn n1--;rn rn else if(pa->e==pb->e)rn rn if(pa->c+pb->c!=0)rn rn pc->c=pa->c+pb->c;rn pc->e=pa->e;rn pa=pa->next;rn pb=pb->next;rn pc->flag=0;rn s=pc; rn pc=new DXS; rn s->next=pc; rn j++;rn n1--;rn n2--;rn rn if(pa->c+pb->c==0)rn rn pa=pa->next;rn pb=pb->next;rn n1--;rn n2--;rn rn rn rn while(n1>0) //把较长的多项式的其余部分放到C中rn rn pc->c=pa->c;rn pc->e=pa->e;rn pa=pa->next;rn pc->flag=0;rn s=pc; rn pc=new DXS; rn s->next=pc; rn j++;rn n1--;rn rn while(n2>0)rn rn pc->c=pb->c;rn pc->e=pb->e;rn pb=pb->next;rn pc->flag=0;rn s=pc; rn pc=new DXS; rn s->next=pc;rn j++;rn n2--;rn rn nc=n3=j; //结果多项式的项数rnrn cout< 论坛

没有更多推荐了,返回首页