閱讀849 返回首頁    go 阿裏雲 go 技術社區[雲棲]


多項式運算線性鏈表的應用

最忙的時候迎來了我們數據結構的大實驗周一的時候編好了一個 線性鏈表的都是什麼什麼係統的 一點意思都沒有啊 看到了一個多項式的 於是我就試了一下 說是要先判斷稀疏度 在確定用線性存儲的還是順序存儲的 順序存儲的我沒寫 覺得還是鏈表的好 因為順序存儲的的開兩個數組 一個是指數是正的 一個指數是負的 覺得可能很不好寫 於是還是寫了個鏈表的 雙向鏈表的 用的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;
}



最後更新:2017-04-02 00:06:57

  上一篇:go JSP中拚裝數據為XML出現的問題
  下一篇:go 穀歌 2012 年終總結:這一年你又好奇著什麼?