【数据结构】--一元n次多项式模板

一元n次多项式

我把first开到公有了。

 

实验二:一元多项式的基本运算

实验目的:掌握用线性表实现一元多项式的基本运算。

实验内容:使用链式存储实现一元多项式的加法、减法、乘法和求导。即:

C(x)= A(x)+B(x);C(x)= A(x)-B(x) C(x)= A(x)*B(x) C(x)= A’(x)

菜单:

1)C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入,遇到系数为0则停止。例如:输入 :

1 2 3 4 5 6 7 8

2 3 4 5 6 7 0 

则生成的多项式分别为:

A(x)=x^2+3x^4+5x^6+7x^8

B(x)=2x^3+4x^5+6x^7

2)P:计算C(x)= A(x)+B(x),计算完毕后输出C(x)的 结果

3)S: 计算C(x)= A(x)-B(x),计算完毕后输出C(x)的 结果

4)M: 计算C(x)= A(x)*B(x),计算完毕后输出C(x)的 结果

5)D: 计算C(x)= A’(x),计算完毕后输出C(x)的 结果

6)V: 首先输入一个 float型数据,然后计算 A(x)并输出计算的结果。

7)E: 分别清空A(x)、B(x)、C(x)三个多项式。

8)X: 退出程序。

 

 

例如:

输入期望输出实际输出
C
1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 0
S
P
M
D
V
2
X
C(x)=x^2-2x^3+3x^4-4x^5+5x^6-6x^7+7x^8
C(x)=x^2+2x^3+3x^4+4x^5+5x^6+6x^7+7x^8
C(x)=2x^5+10x^7+28x^9+52x^11+58x^13+42x^15
C(x)=2x+12x^3+30x^5+56x^7
2164.00
C(x)=x^2-2x^3+3x^4-4x^5+5x^6-6x^7+7x^8
C(x)=x^2+2x^3+3x^4+4x^5+5x^6+6x^7+7x^8
C(x)=2x^5+10x^7+28x^9+52x^11+58x^13+42x^15
C(x)=2x+12x^3+30x^5+56x^7
2164.00
C
2 2 0
2 2 3 3 0
P
S
M
D
V
3.1
X
C(x)=4x^2+3x^3
C(x)=-3x^3
C(x)=4x^4+6x^5
C(x)=4x
19.22
C(x)=4x^2+3x^3
C(x)=-3x^3
C(x)=4x^4+6x^5
C(x)=4x
19.22
C
3 0 2 2 0
-2 2 3 3 0
M
V
2.1
P
S
D
X
C(x)=-6x^2+9x^3-4x^4+6x^5
11.82
C(x)=3+3x^3
C(x)=3+4x^2-3x^3
C(x)=4x
C(x)=-6x^2+9x^3-4x^4+6x^5
11.82
C(x)=3+3x^3
C(x)=3+4x^2-3x^3
C(x)=4x

通过所有测试 

 
  

 

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
class List;
class LinkNode
{
    friend class List;
private:
    int a,p;
    LinkNode *link;
public:
    LinkNode(const int & item1,const int& item2, LinkNode *ptr = NULL)
    {
        a=item1;
        p=item2;
        link=ptr;
    }
    LinkNode (LinkNode *ptr = NULL)
    {
        link=ptr;
    }
    ~LinkNode() { };
};
class List
{
private:

public:
    LinkNode *first;
    List ()
    {
        first = new LinkNode ();
    }
    ~List ()
    {
        MakeEmpty(first);   //析构函数
    }
    void MakeEmpty (LinkNode *first);      //链表置空
    int Remove ( int i );     //需要补充的成员函数
    void input( LinkNode *first);
    void output( LinkNode *aa);      //需要补充的成员函数
    void Sort( LinkNode *aa);
    void Insert(int val);
    void add(LinkNode *aa,LinkNode *b);
    void jian(LinkNode *aa,LinkNode *b);
    void mult(LinkNode *aa,LinkNode *b);
    void devide(LinkNode *aa);
    double caculate(LinkNode *aa,double val);
};
void List:: MakeEmpty (LinkNode *first)
{
    LinkNode *q;
    while (first->link != NULL )
    {
        q = first->link;
        first->link = q->link;
        delete q;
    }
}
void List:: input(  LinkNode *first)
{
    int n,val,cnt;
    LinkNode *newnode;
    for(int i=1; ; i++)
    {
        cin>>val;
        if(val==0)
            break;
        cin>>cnt;
        newnode=new LinkNode(val,cnt);
        newnode->link=first->link;
        first->link=newnode;

    }
}
void List::Sort(LinkNode *first)
{
    LinkNode *i=first->link,*j;
    while (i!= NULL )
    {
        j=i->link;
        while(j!=NULL)
        {
            if(i->p>j->p)
            {
                int temp;
                temp=j->p;
                j->p=i->p;
                i->p=temp;
                temp=j->a;
                j->a=i->a;
                i->a=temp;
                ///改成结构体存ap的话,就很简单了,但是我不想改了hhh
            }
            j=j->link;
        }
        i=i->link;
    }
}
void List::output( LinkNode *first)
{
    cout<<"C(x)=";
    LinkNode *q=first->link;
    int cnt=0;
    while (q!= NULL )
    {
        if(q->a>0&&cnt>0)printf("+");
        if(q->a==0)
        {
        }
        else
        {

            if(q->p==0&&q->a==1) printf("1"),cnt++;
            if(q->a!=1)printf("%d",q->a),cnt++;
            if(q->p==0) {cnt++;}
            else if(q->p!=1) {
                    printf("x^%d",q->p);
                    cnt++;
            }
            else if(q->p==1)
            {
                printf("x");
                cnt++;
            }
        }
        q =q->link;
    }
    if(cnt==0) cout<<"0"<<endl;
    cout<<endl;
}
void List::add(LinkNode *aa,LinkNode *b)
{
    LinkNode *i=aa,*newnode,*temp=first;
    //cout<<aa->link->a<<endl;
    while(i->link!=NULL)
    {
        int f=0;
        LinkNode *j=b;
        while(j->link!=NULL)
        {
            if((i->link->p)==(j->link->p))
            {
                f=1;
                int val=i->link->a+j->link->a;
                //int cnt=i->link->p+j->link->p;
                newnode=new LinkNode(val,i->link->p);
                newnode->link=first->link;
                first->link=newnode;
            }
            j=j->link;
        }
        if(f==0)
        {
            newnode=new LinkNode(i->link->a,i->link->p);
            newnode->link=first->link;
            first->link=newnode;
        }
        i=i->link;
    }
    ///
    ///
    i=b;///*i=b是错误写法
    while(i->link!=NULL)
    {
        int f=0;
        LinkNode *j=aa;
        while(j->link!=NULL)
        {
            if((i->link->p)==(j->link->p))
            {
                f=1;
            }
            j=j->link;
        }
        if(f==0)
        {
            newnode=new LinkNode(i->link->a,i->link->p);
            newnode->link=first->link;
            first->link=newnode;
        }
        i=i->link;
    }
}
void List::jian(LinkNode *aa,LinkNode *b)
{
    LinkNode *i=aa,*newnode,*temp=first;
    //cout<<aa->link->a<<endl;
    while(i->link!=NULL)
    {
        int f=0;
        LinkNode *j=b;
        while(j->link!=NULL)
        {
            if((i->link->p)==(j->link->p))
            {
                f=1;
                int val=i->link->a-j->link->a;
                //int cnt=i->link->p+j->link->p;
                newnode=new LinkNode(val,i->link->p);
                newnode->link=first->link;
                first->link=newnode;
            }
            j=j->link;
        }
        if(f==0)
        {
            newnode=new LinkNode(i->link->a,i->link->p);
            newnode->link=first->link;
            first->link=newnode;
        }
        i=i->link;
    }
    ///
    ///
    i=b;///*i=b是错误写法
    while(i->link!=NULL)
    {
        int f=0;
        LinkNode *j=aa;
        while(j->link!=NULL)
        {
            if((i->link->p)==(j->link->p))
            {
                f=1;
            }
            j=j->link;
        }

        if(f==0)
        {
            newnode=new LinkNode(-i->link->a,i->link->p);
            newnode->link=first->link;
            first->link=newnode;
        }
        i=i->link;
    }
}
void List::mult(LinkNode *aa,LinkNode *b)
{
    LinkNode *i=aa,*j=b,*newnode;
    while(i->link!=NULL)
    {
        j=b;///前面已经定义过了
        while(j->link!=NULL)
        {
            newnode=new LinkNode(i->link->a*j->link->a,i->link->p+j->link->p);
            newnode->link=first->link;
            first->link=newnode;
            j=j->link;
        }
        i=i->link;
    }
    LinkNode *temp=first->link;
    Sort(first);
    //output(first);
    while(temp!=NULL)
    {
        LinkNode *tt=temp;
        if(temp->link!=NULL)
        {
            while(tt->p==tt->link->p&&tt->link!=NULL)
            {
                temp->a+=tt->link->a;
                temp->link=tt->link;
                tt=tt->link;
            }
            temp->link=tt->link;
        }
        temp=tt->link;
    }

}
void List::devide(LinkNode *aa)
{
    LinkNode *newnode,*i=aa->link;
    while(i!=NULL)
    {
         newnode=new LinkNode(i->a*i->p,i->p-1);
         newnode->link=first->link;
         first->link=newnode;
         i=i->link;
         //cout<<newnode->a<<" "<<newnode->p<<endl;
    }
}
double  List::caculate(LinkNode *aa,double val)
{
    double ans=0;
    LinkNode *i=aa->link;
    while(i!=NULL)
    {
        ans+=i->a*pow(val,i->p);
        i=i->link;
    }
    return ans;
}
int main()
{
    List La,Lb,Lc;
    string s;
    cin>>s;
    if(s[0]=='C')
    {
        La.input(La.first);
        La.Sort( La.first);
        Lb.input(Lb.first);
        Lb.Sort( Lb.first);
    }
//    La.output(La.first);
//    cout<<endl;
//    Lb.output(Lb.first);
    while(1)
    {
        cin>>s;
        if(s[0]=='X')
            return 0;
        else if(s[0]=='S')
        {
            Lc.MakeEmpty(Lc.first);
            Lc.jian(La.first,Lb.first);
            //Lc.output(Lc.first);
            Lc.Sort(Lc.first);
            Lc.output(Lc.first);
        }
        else if(s[0]=='P')
        {
            Lc.MakeEmpty(Lc.first);
            Lc.add(La.first,Lb.first);
            //Lc.output(Lc.first);
            Lc.Sort(Lc.first);
            Lc.output(Lc.first);
        }
        else if(s[0]=='M')
        {
            Lc.MakeEmpty(Lc.first);
            Lc.mult(La.first,Lb.first);
            //Lc.output(Lc.first);
            Lc.Sort(Lc.first);
            Lc.output(Lc.first);
        }
        else if(s[0]=='D')
        {
            //La.output(La.first);
            Lc.MakeEmpty(Lc.first);
            Lc.devide(La.first);
            Lc.Sort(Lc.first);
            Lc.output(Lc.first);
        }
        else if(s[0]=='V')
        {
            double data;
            cin>>data;
            printf("%.2f\n",La.caculate(La.first,data));
        }
        else if(s[0]=='E')
        {
            La.MakeEmpty(La.first);
            Lb.MakeEmpty(Lb.first);
            Lc.MakeEmpty(Lc.first);
        }
    }


    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值