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

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

多项式运算线性链表的应用的相关文章

线性链表及其基本操作及用链表实现的多项式

线性链表及其基本操作 链表在空间的合理利用上和插入.删除时不需要移动等优点,因此在很多场合下,它是线性表的首先储存结构.然而它也存在着实现某些基本操作,如求线性表的长度时不如顺序储存结构的特点.因而从新定义线性链表及其基本操作 头文件: #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef int Status; typedef

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个"指针"域,存放下一元素在数组中的下标.且0为代表空指针   //设S为SLinkList

c语言-线性链表数据结构的插入与删除

问题描述 线性链表数据结构的插入与删除 在你自己的文件下,建立一个C语言程序SL.C,完成下列要求: 1. 定义长度为10的数组,输入9个数据(1,3,4,5,7,9,12,20,28),然后输出这九个数组元素的存储单元地址和相应的数值: 2. 建立一个数组元素的插入函数,能够按照数据从小到大的次序自动找到插入位置完成插入元素的操作,调用此函数插入数据15,然后输出数值元素的存储单元地址和相应的数值: 3. 建立一个数组元素的删除函数,能够按照数据自动删除指定元素的操作,调用此函数删除数据值为9

链表 初始化-关于线性链表的初始化问题

问题描述 关于线性链表的初始化问题 typedef struct LNode{ int data; struct LNode *next; }LinkList; InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } main() { LinkList *L; InitList(L); } 请问初始化函数的形参L前为什么要加地址符&?去掉为什么会出错? 解决方案 那个不是取地址,

数据结构实践项目——链表

本组项目针对<数据结构基础系列(2):线性表>课程第8-15节 8. 线性表的链式存储 9. 建立单链表 10. 单链表基本操作的实现 11. 单链表应用举例 12. 双链表 13. 循环链表 14. 线性表的应用 15. 有序表 [项目1 - 建立单链表] 定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果. 请在下面代码的基础上开展工作: #include <stdio.h> #include <malloc.h> typedef int Ele

数据结构教程 第八课 线性表的链式表示与实现

本课主题: 线性表的链式表示与实现 教学目的: 掌握线性链表.单链表.静态链表的概念.表示及实现方法 教学重点: 线性链表之单链表的表示及实现方法. 教学难点: 线性链表的概念. 授课内容: 一.复习顺序表的定义. 二.线性链表的概念: 以链式结构存储的线性表称之为线性链表. 特点是该线性表中的数据元素可以用任意的存储单元来存储.线性表中逻辑相邻的两元素的存储空间可以是不连续的.为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指示其直接衙继的信息.这两部分信息组成数据

线性表的链式表示和实现

一.前言     线性表的顺序存储结构特点是:逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任何一个元素.    缺点:在作插入删除操作时,需要移动大量元素. 二.链式存储结构     概念:它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有的弱点,但同时也失去顺序表可随机存取的优点. 三.线性链表     存储空间可以连续也可以不连续.为了表示ai和ai+1的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直

c++-C++链表(我写的程序自己也看不懂)

问题描述 C++链表(我写的程序自己也看不懂) 建立一个10结点的单向链表,每个结点包括学号,姓名,性别,年龄,对其进行排序,采用插入排序法,按学号从小到大排序.(我链表没听懂,基础概念讲讲也好~) 解决方案 以下是创建链表的代码,c语言结构体实现:(不带头结点,一级指针实现,当然可以多级指针实现,也可以带头结点,也可以是循环链表,也可以是双向循环链表)#include #include //链表结构体定义typedef struct _NODE{ int data; struct _NODE

数据结构模版----单链表SimpleLinkList[带头结点&amp;&amp;面向对象设计思想](C语言实现)

链表中的数据是以节点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.以"结点的序列"表示线性表称作线性链表(单链表) 单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素. [cpp] view plain copy print? #include <stdio.h>   #include <stdlib.h>   #include <