实现多项式的基本运算

原创 2018年04月17日 20:20:26
#include<iostream>
#include<stdlib.h>
using namespace std;
class LinkNode
{
    public:
        int data;
        int exp;
        LinkNode *link;
        LinkNode() {}//
        LinkNode(int x,int y)
        {
            data = x;
            exp = y;
            link = NULL;
        }
    };
class List
{
public:
    friend LinkNode;
    LinkNode * first;
    List ()
    {
        first = new LinkNode(0,-1);
    }
    ~List ()
    {
        delete first;
    }
    void lian(int &x,int &y);
    void output1(int i);
    void output2();
    void paixu();
    void jiafa(List &a);
    void qiudao();
    void qiuzhi(int);
};

void List::lian(int &x, int &y)//xishu and zhishu
{
    LinkNode *current=first;
    while(current->link!=NULL)
    {
        current=current->link;
    }
    LinkNode *a = new LinkNode(x,y);
    current->link=a;
}

void List::paixu()//系数从小到大排序
{
    int l = 0;
    LinkNode *current =first;
    while(current->link!=NULL)
    {
        l++;
        current=current->link;
    }
    int i = 0;
    LinkNode *p =first;
    LinkNode *q;
    for(i=0; i<l; i++)
    {
        p=first;
        q=NULL;
        while(p->link->link!=NULL)
        {
            if(p->link->exp > p->link->link->exp)
            {
                q=p->link;
                p->link=q->link;
                q->link=p->link->link;
                p->link->link=q;
            }
            p=p->link;
        }
    }
}

void List ::jiafa(List  &b)//多项式假发
{
    List  c;
    LinkNode *k = first->link;
    while (k != NULL)
    {
        c.lian(k->data, k->exp);
        k = k->link;
    }
    int flag = 1;
    LinkNode *q = c.first->link;
    LinkNode *p = b.first->link;
    while (p != NULL)
    {
        q = c.first->link;
        flag = 1;
        while (q != NULL)
        {
            if (p->exp == q->exp)
            {
                q->data = q->data + p->data;
                flag = 0;
            }
            q = q->link;
        }
        if (flag)
        {
            c.lian(p->data, p->exp);
        }
        p = p->link;
    }
    c.paixu();
    c.output2();
}

void List::qiudao()//多项式求导,exp-1乘data
{
    List a;
    LinkNode *k =first->link;
    while(k!=NULL)
    {
        a.lian(k->data,k->exp);
        k=k->link;
    }
    k=a.first->link;
    while(k!=NULL)
    {
        k->data=(k->data)*(k->exp);
        k->exp=k->exp-1;
        k=k->link;
    }
    a.output2();
}


void List::qiuzhi(int x)
{
    int s = 0;
    int q = 1;
    LinkNode *p =first->link;
    while(p!= NULL)
    {
        q=1;
        for (int i=0; i<p->exp; i++)
        {
            q=q*x;
        }
        s=s+p->data*q;
        p=p->link;
    }
    cout<<s<<endl;
}

void List::output1(int i)
{
    if(first->link==NULL)
    {
        cerr<<"该链表为空!!!!!"<<endl;
        exit(1);
    }
    LinkNode *current = first->link;
    for(int k=1; k <i; k++)
    {
        if(current->link == NULL)
        {
            cerr<<"是无效的位置!!!!!!!!!!!"<<endl;
            exit(1);
        }
        else
        {
            current=current->link;
        }
    }


    cout<<current->data<<endl;
}

void List::output2()
{
    if(first->link == NULL)
    {
        cerr<<"链表为空!!!!!!"<<endl;
        exit(1);
    }
    LinkNode *current =first->link;
    int i = 1;
    while(current != NULL)
    {
        if(current->data==0)
        {
            current=current->link;
            continue;
        }


        if (i != 1)
        {
            if (current->data == 1)
            {
                cout << "+";
            }
            else if (current->data > 1)
            {
                cout << "+" << current->data;
            }
            else{
                cout << current->data;
            }
        }
        else
        {
            if (current->data == 1) {  }
            else{
                cout << current->data;
            }
        }


        if (current->exp != 1)
        {
            cout << "x^";
            cout << current->exp;
        }
        else
        {
            cout << "x";
        }
        i++;
        current = current->link;
    }
    cout<<endl;
}
int main()
{
    int i,a,b,e,f,g;
    List la;
    List lb;
    cin>>a;
    for (i=0;i<a;i++)
    {
        cin>>e>>f;
        la.lian(e, f);
    }
    cin>>b;
    for(i=0;i<b;i++)
    {
        cin>>e>>f;
        lb.lian(e,f);
    }
    cin>>g;
    cout<<"A(x)+B(x)=";
    la.jiafa(lb);
    cout<<"A'(x)=";
    la.qiudao();
    cout<<"A("<<g<<")=";
    la.qiuzhi(g);
    return 0;
}

利用单链表实现多项式基本运算(C++模板实现)

  • 2014年08月10日 16:47
  • 4KB
  • 下载

单链表的运用——多项式及其运算

包括:多项式的class定义+多项式加法+多项式乘法 黄金周即将过去,好多任务都没有完成,还好提前意识到,最近两天只好奋笔疾书了! 本篇依旧是数据结构的内容,但是是单链表的一个应用实例,还是比较实...
  • weixin_37818081
  • weixin_37818081
  • 2017-10-07 10:06:22
  • 186

用单链表实现多项式的运算

  • 2011年10月31日 09:51
  • 7KB
  • 下载

用单链表实现多项式运算(ANSI C)

1、多项式结构定义polynomial.h #ifndef _polynomial_h #define _polynomial_h struct poly_term { int expn; ...
  • fduan
  • fduan
  • 2011-12-23 02:48:01
  • 380

数组和广义表的基本运算实现

一、实验题目 假设nn的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能: (1)生成如下两个稀疏矩阵的三元组a和b;         (2)输出a转置矩阵的三元组; ...
  • liyingjie01
  • liyingjie01
  • 2016-05-30 13:04:08
  • 647

多项式计算用c++实现

  • 2017年02月22日 20:25
  • 10KB
  • 下载

线性表的基本运算及多项式的算术运算

线性表的基本运算: template voidSeqList::Reverse(){   T* t= new T[maxLength];   int j=0;   for (int i ...
  • s89QL
  • s89QL
  • 2015-10-10 20:56:55
  • 1239

多项式运算C语言源码

  • 2012年05月16日 13:45
  • 3KB
  • 下载

C++编写的多项式运算系统源代码

  • 2011年06月15日 09:28
  • 1.91MB
  • 下载

多项式的加法和乘法的算法

  • 2011年01月09日 18:57
  • 34KB
  • 下载
收藏助手
不良信息举报
您举报文章:实现多项式的基本运算
举报原因:
原因补充:

(最多只允许输入30个字)