多项式运算线性链表的应用

简介:

最忙的时候迎来了我们数据结构的大实验周一的时候编好了一个 线性链表的都是什么什么系统的 一点意思都没有啊 看到了一个多项式的 于是我就试了一下 说是要先判断稀疏度 在确定用线性存储的还是顺序存储的 顺序存储的我没写 觉得还是链表的好 因为顺序存储的的开两个数组 一个是指数是正的 一个指数是负的 觉得可能很不好写 于是还是写了个链表的 双向链表的 用的C++写的 觉得可以运算符重载挺好的

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
class Xiang   //此乃线性链表 下面还要开数组再做 我真是蒙了
{
public:
    double coefficient;//多项式系数
    int power; //多项式的幂
    Xiang* next;
    Xiang* last;
};
class polynomial//多项式
{
public:
    int num;//项数
    Xiang *head;
    Xiang *tail;
    polynomial();//初始化
    void input();//从键盘输入多项式
    void displayup();//按指数升序输出多项式
    void displaydown();//按指数降序输出多项式
    void sort();//合并同类项并将多项式排序并删除系数为0的项
    bool addXiang();//从键盘输入增加项 构建多项式
    bool addXiang(double co,int po);//按照参数增加项
    polynomial qiuhe(polynomial p1,polynomial p2);//求和函数
    polynomial qiucha(polynomial p1,polynomial p2);//求差函数
    polynomial chengji(polynomial p1,polynomial p2);//求乘积
    polynomial operator +(polynomial p2);//重载运算符
    polynomial operator -(polynomial p2);
    polynomial operator *(polynomial p2);
};

polynomial::polynomial()//初始化
{
    num=0;
    head=new Xiang;
    head->next=NULL;
    head->last=NULL;
    tail=NULL;
}

void polynomial::input()
{
    do
    {
        cout<<"please input the num of polynomial(num>=0)"<<endl;
        cin>>num;
    }
    while(num<0);
    for(int i=0; i<num; i++)
        cout<<"num "<<i+1<<": ",addXiang();
    sort();
}

void polynomial::displayup()
{
    if(num==0)
    {
        cout<<0<<endl;
        return ;
    }
    Xiang *p=head->next;
    for(int i=0; i<num; i++)
    {
        if(p->coefficient<0)
            cout<<p->coefficient<<"X^"<<p->power;
        else if(i)
            cout<<"+"<<p->coefficient<<"X^"<<p->power;
        else
            cout<<p->coefficient<<"X^"<<p->power;
        p=p->next;
    }
    cout<<endl;
}

void polynomial::displaydown()
{
    if(num==0)
    {
        cout<<0<<endl;
        return ;
    }
    Xiang *p=tail;
    for(int i=0; i<num; i++)
    {
        if(p->coefficient<0)
            cout<<p->coefficient<<"X^"<<p->power;
        else if(i)
            cout<<"+"<<p->coefficient<<"X^"<<p->power;
        else
            cout<<p->coefficient<<"X^"<<p->power;
        p=p->last;
    }
    cout<<endl;
}

bool polynomial::addXiang()
{
    Xiang *p=new Xiang;
    Xiang *q=tail;
    double c=0;
    int po=0;
    cin>>c>>po;
    if(head->next==NULL)
    {
        head->next=p;
        p->coefficient=c;
        p->power=po;
        p->next=NULL;
        p->last=head;
        tail=p;
    }
    else
    {
        q->next=p;
        p->last=q;
        p->coefficient=c;
        p->power=po;
        p->next=NULL;
        tail=p;
    }
    return 1;
}

bool polynomial::addXiang(double co,int po)
{
    Xiang *p=new Xiang;
    Xiang *q=tail;
    if(head->next==NULL)
    {
        head->next=p;
        p->coefficient=co;
        p->power=po;
        p->next=NULL;
        p->last=head;
        tail=p;
    }
    else
    {
        q->next=p;
        p->last=q;
        p->coefficient=co;
        p->power=po;
        p->next=NULL;
        tail=p;
    }
    num++;
    sort();
    return 1;
}

void polynomial::sort()//先排序 再合并同类项 再删除系数是0的项 是的= = 这就是这个作业的核心啊 无论加减乘除都少不了= =
{
    Xiang *a=head->next;
    Xiang *b;
    for(int i=0; i<num; i++) //排序的时间复杂度为 n^2 没有操作指针直接用swap函数交换值 这样也可以吧。。
    {
        b=a;
        for(int j=i; j<num; j++)
        {
            if(b->power<a->power)
                swap(a->coefficient,b->coefficient),swap(a->power,b->power);
            b=b->next;
        }
        a=a->next;
    }
    a=head->next;
    for(int i=0; i<num; i++) //合并同类项
    {
        if(a->coefficient==0)
        {
            a=a->next;
            continue;
        }
        b=a->next;
        for(int j=i+1; j<num; j++)
        {
            if(b->power!=a->power)
                break;
            a->coefficient+=b->coefficient;
            b->coefficient=0;
            b=b->next;
        }
        a=a->next;
    }
    int newnum=0;
    a=head->next;
    tail=a;
    Xiang *p=head->next;
    for(int i=0; i<num; i++)//去0 把利用已有的结构 还是改数非零的前移最后尾结点提前
    {
        if(a->coefficient!=0)
        {
            p->coefficient=a->coefficient;
            p->power=a->power;
            tail=p;
            p=p->next;
            newnum++;
        }
        a=a->next;
    }
    tail->next=NULL;
    num=newnum;
}

polynomial polynomial::qiuhe(polynomial p1,polynomial p2)
{
    polynomial ans;
    Xiang *p;
    p=p1.head->next;
    for(int i=0; i<p1.num; i++)
        ans.addXiang(p->coefficient,p->power),p=p->next;
    p=p2.head->next;
    for(int i=0; i<p2.num; i++)
        ans.addXiang(p->coefficient,p->power),p=p->next;
    ans.sort();
    return ans;
}

polynomial polynomial::qiucha(polynomial p1,polynomial p2)
{
    polynomial ans;
    Xiang *p;
    p=p1.head->next;
    for(int i=0; i<p1.num; i++)
        ans.addXiang(p->coefficient,p->power),p=p->next;
    p=p2.head->next;
    for(int i=0; i<p2.num; i++)
        ans.addXiang(-p->coefficient,p->power),p=p->next;
    ans.sort();
    return ans;
}

polynomial polynomial::chengji(polynomial p1,polynomial p2)
{
    polynomial ans;
    Xiang *p,*q;
    q=p2.head->next;
    for(int i=0; i<p2.num; i++)
    {
        p=p1.head->next;
        for(int j=0; j<p1.num; j++)
        {
            ans.addXiang(p->coefficient*q->coefficient,p->power+q->power);
            p=p->next;
        }
        q=q->next;
        ans.sort();
    }
    return ans;
}

polynomial polynomial:: operator+(polynomial p2)
{
    polynomial p1;
    return p1.qiuhe(*this,p2);
}

polynomial polynomial:: operator-(polynomial p2)
{
    polynomial p1;
    return p1.qiucha(*this,p2);
}

polynomial polynomial:: operator*(polynomial p2)
{
    polynomial p1;
    return p1.chengji(*this,p2);
}
int main()
{
    polynomial p,ans,q;
    p.input();
    p.displayup();
    p.displaydown();
    p.addXiang(1,5);
    p.displayup();
    q.input();
    q.displayup();
    ans=p+q;
    ans.displayup();
    ans=p-q;
    ans.displayup();
    ans=p*q;
    ans.displayup();
    return 0;
}



目录
相关文章
|
2月前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
66 10
【数据结构】链表从实现到应用,保姆级攻略
|
27天前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
2月前
|
前端开发 JavaScript C++
详解链表在前端的应用,顺便再弄懂原型和原型链!
该文章深入解析了链表在前端开发中的应用,并详细阐述了JavaScript中的原型和原型链的概念及其工作原理。
|
5月前
|
存储 算法
单链表的应用
单链表的应用
39 6
|
5月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
5月前
链表\链表基础应用
链表\链表基础应用
24 3
|
6月前
|
存储 调度 C语言
链表,栈,队列的区别及其应用
链表,栈,队列的区别及其应用
|
6月前
|
存储 算法 C语言
链表带头和不带头的区别及其应用
链表带头和不带头的区别及其应用
|
6月前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
|
6月前
单链表的应用
上篇博客中,我们学习了单链表,为了更加熟练掌握这一知识点,就让我们将单链表的应用操练起来吧!
52 0