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