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

简介:

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



目录
相关文章
|
5天前
单链表的应用
上篇博客中,我们学习了单链表,为了更加熟练掌握这一知识点,就让我们将单链表的应用操练起来吧!
|
2月前
|
存储 编译器 C语言
【数据结构】深入浅出理解链表中二级指针的应用
【数据结构】深入浅出理解链表中二级指针的应用
31 0
|
2月前
|
存储 缓存 算法
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
C++链表解析:从基础原理到高级应用,全面掌握链表的使用
59 0
|
3月前
|
算法
链表中快慢指针的应用
链表中快慢指针的应用
|
5月前
数据结构循环链表之介绍和应用 | 第一套
数据结构循环链表之介绍和应用 | 第一套
26 0
|
9月前
|
存储 算法 Java
Java LinkedList:探索双向链表的灵活应用
在Java编程中,LinkedList是一种重要的数据结构,它在内存中以双向链表的形式存储数据,为我们提供了一种动态而灵活的数据管理方式。本文将引导您深入了解Java中的LinkedList,包括其特点、用法、与ArrayList的比较,以及实际应用场景。
|
10月前
|
存储 C++
指针及其应用5——指针链表
指针及其应用5——指针链表
|
存储
【线性表】—带头哨兵卫单链表的应用
【线性表】—带头哨兵卫单链表的应用
100 0
|
机器学习/深度学习 存储 人工智能
【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++
数组与链表都是相当重要的结构化数据类型,也都是典型线性表的应用。线性表用于计算机中的数据存储结构,按照内存存储的方式基本上可以分为以下两种:静态数据结构和动态数据结构。数组类型就是一种典型的静态数据结构,动态数据结构又称为链表。在我前面的算法系列文章都细致的对二者的使用方法做过讲解。
159 0
【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++