一元稀疏多项式(详解加注释)

题目:

   一元稀疏多项式简单计算器的基本功能是:

1.输入并建立多项式;

2.输出多项式,输出形式为整数序列:n,c1,e1,,c2,e2 …… cn,en,其中 n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。

3.多项式a和b相加,建立多项式a+b

4.多项式a和b相减 ,建立多项式a-b

代码如下:

#include <iostream>
using namespace std;
typedef struct PNode
{
    float coef;        //系数
    int expn;          //指数
    struct PNode *next;//指针域
}PNode,*PnodeList;
int InitList(PnodeList &L)
{
	L=new PNode;
	L->next=NULL;
	return 0;
 }
void Createlist(PnodeList &P,int n)
{
    PnodeList s,pre,q;
    for(int i=1;i<=n;++i)          //依次输入n个非零项
    {
        s=new PNode;
        cin>>s->coef>>s->expn;
        pre=P;                 //用于保存q的前驱,初值为头结点
        q=P->next;             //q初始化指向首元结点
        while(q&&q->expn>s->expn)  //通过比较指数找到第一个小于输入项指数的项*q
        {
            pre=q;
            q=q->next;
        }
        s->next=q;                  //将输入项s插入到q和其前驱结点pre之间
        pre->next=s;
    }
}
void Opertion(PnodeList &pa,PnodeList &pb)//多项式运算:加法pa=pa+pb
{
    PnodeList p1,p2,p3,r;
    int sum;
    p1=pa->next;//p1,p2初值指向首元结点
    p2=pb->next;
    p3=pa;      //p3指向和多项式当前结点,初值为pa
    while(p1&&p2)
    {
        if(p1->expn==p2->expn)
        {
              sum=p1->coef+p2->coef;
            if(sum!=0)
            {
                p1->coef=sum;//修改pa为两系数的和
                p3->next=p1;p3=p1;//将修改后的pa当前结点链在p3之后,p3指向p1
                p1=p1->next;
                r=p2;p2=p2->next;delete r;//删除pb当前结点
            }
            else
            {
                r=p1;p1=p1->next;delete r;//删除当前结点,指向后一项
                r=p2;p2=p2->next;delete r;
            }
        }
        else if(p1->expn>p2->expn)
        {
            p3->next=p1;     //将p1链在p3之后
            p3=p1;
            p1=p1->next;
        }
        else
        {
            p3->next=p2;     //将p2链在p3之后
            p3=p2;
            p2=p2->next;
        }
    }
    p3->next=p1?p1:p2;   //插入非空多项式的剩余段
    delete pb;
}
void Opertion1(PnodeList &pa,PnodeList &pb)//多项式运算:减法pa=pa-pb
{
    PnodeList p1,p2,p3,r;
    int sum;
    p1=pa->next;//p1,p2初值指向首元结点
    p2=pb->next;
    p3=pa;      //p3指向差多项式当前结点,初值为pa
    while(p1&&p2)
    {
        if(p1->expn==p2->expn)
        {
              sum=p1->coef-p2->coef;
            if(sum!=0)
            {
                p1->coef=sum;//修改pa为两系数的和
                p3->next=p1;p3=p1;//将修改后的pa当前结点链在p3之后,p3指向p1
                p1=p1->next;
                r=p2;p2=p2->next;delete r;//删除pb当前结点
            }
            else
            {
                r=p1;p1=p1->next;delete r;//删除当前结点,指向后一项
                r=p2;p2=p2->next;delete r;
            }
        }
        else if(p1->expn>p2->expn)
        {
            p3->next=p1;     //将p1链在p3之后
            p3=p1;
            p1=p1->next;
        }
        else
        {
            p2->coef=0-p2->coef;
            p3->next=p2; //将p2链在p3之后
            p3=p2;
            p2=p2->next;
        }
    }
    if(p3->next=p1)  //插入非空多项式的剩余段
        p3->next=p1;
    else{
        p3->next=p2;
        while(p2)//第二段连上要变成负的
       {
        p2->coef=0-p2->coef;
        p2=p2->next;
       }
    }
    delete pb;
}
void outlist(PnodeList p)
{
    PnodeList q;
    int num=0;
    q=p->next;
    if(q==NULL)//判断链表是否为空
        cout<<"0";
    else{
        while(q)
        {
            num++;
            q=q->next;
        }
        cout<<num;
        q=p->next;
        while(q)
      {
        cout<<","<<q->coef<<","<<q->expn;
        q=q->next;
      }
    }
}
int main()
{
    PnodeList a,b;
    InitList(a);
    InitList(b);
    int n1,n2;
    cout<<"请输入pa表中的多项式项数:";
    cin>>n1;
    cout<<"请输入pa表的系数和指数:(格式:1 2)"<<endl;
    Createlist(a,n1);
    cout<<"请输入pb表中的多项式项数:";
    cin>>n2;
    cout<<"请输入pb表中的系数和指数:(格式:1 2)"<<endl;
    Createlist(b,n2);
    cout<<" --------------------------\n";
    cout<<"|    请输入运算符:+或-     |"<<endl;
    cout<<" --------------------------"<<endl;
    string m;
    cin>>m;
    if(m=="+")
      {
        Opertion(a,b);
        cout<<"相加的结果为:";
        outlist(a);
      }
    else if(m=="-")
      {
        Opertion1(a,b);
        cout<<"相减的结果为:";
        outlist(a);
      }
    else
        cout<<"当前运算符不在操作范围内!!!";
    return 0;
}

运行截图:

猜你喜欢

转载自blog.csdn.net/qq_41679818/article/details/86656344