利用單鏈表進行多項式運算

2021-08-29 07:52:01 字數 4017 閱讀 5224

1.什麼是運算子過載函式?

2.什麼是友元函式

3.const函式的使用與作用

4.單鏈錶能為大家做些什麼

總所周知資料結構由某一資料元素的集合和該集合中資料元素之間的關係組成,在資料儲存上我們將物理記憶體單元連續的儲存方式稱之為線性結構,例如陣列。物理記憶體單元不連續的稱之為離散結構,資料之間的鏈結往往通過指標實現,例如鍊錶,樹結構和圖結構。今天我們介紹的就是一種非線性結構--單鏈表,這種資料結構可以很好的解決多項式運算中,並且做到了記憶體空間上的節省。

上面是兩個多項式,我們可以用很多種資料結構來表示,比如說定義乙個結構體陣列,每乙個陣列的索引都和項的指數相等。如果多項式比較稀疏那麼就會造成很大的記憶體空間浪費,這也是所有陣列的通病。為此我們可以利用鍊錶的結構極大地解決了空間浪費這一問題。

struct term 

/*結構體成員函式,尾插法插入鍊錶,並返回新節點指標*/

term* insertafter(float c, int e);

/*利用類的友元函式對多元運算子進行過載*/

friend ostream& operator << (ostream&, const term&);

};

下面你可能會問以下兩個問題:一、為什麼要用到運算子過載?二、為什麼會用到友元函式?下面我給大家一一說明。

在c++中《是將輸出流輸出到控制台的運算子,我們可以cout<

關於這裡我們為什麼將友元函式用在了operator函式過載上,我給大家講一下。我們假設有乙個類class,這個類有兩個資料成員a和b,我們定義了兩個物件a1和a2,如果沒有運算子+的過載函式,我們無法直接進行a1+a2。這裡我們可以定義乙個operator+()函式使得a1+a2等價於a1.a+a2.a,a1.b+a2.b,這裡a1+a2等價於a1.operator(a2),相當於將物件a2中的a和b這倆資料成員加到了物件a1的a和b中。在《的過載函式中有兩個形參,所以我們可以利用友元函式對運算子進行過載。這裡有乙個關於友元函式對運算子進行過載的小例子,大家可以看看。

class polynomial 			//預設建構函式

polynomial(polynomial& r); //複製建構函式

friend polynomial& operator+(polynomial& l, polynomial& r);//兩個polynomial類的物件相加得到乙個新的polynomial類的物件

friend polynomial& operator*(polynomial& l, polynomial& r);//對運算子*進行過載

friend ostream& operator<

friend istream& operator >> (istream& in, polynomial& l);//輸入流運算子》過載

term* gethead()const //返回頭結點指標

int getmaxexp(); //返回最大的指數的值

};

#pragma once

#include#includeusing namespace std;

/*為何設計為struct,因為係數和指數都可以被直接被訪問*/

struct term

term* insertafter(float c, int e);

friend ostream& operator << (ostream&, const term&);//利用類的友元函式對多元運算子進行過載

};class polynomial //預設建構函式

polynomial(polynomial& r); //複製建構函式

friend polynomial& operator+(polynomial& l, polynomial& r);//兩個polynomial類的物件相加得到乙個新的polynomial類的物件

friend polynomial& operator*(polynomial& l, polynomial& r);//對運算子*進行過載

friend ostream& operator<

friend istream& operator >> (istream& in, polynomial& l);//輸入流運算子》過載

term* gethead()const //返回頭結點指標

int getmaxexp(); //返回最大的指數的值

};term * term::insertafter(float c, int e)

ostream& operator<

out << x.coef;

switch (x.exp)

return out;

}polynomial::polynomial(polynomial& r)

}/*零多項式返回-1,否則返回最後一項的指數*/

int polynomial::getmaxexp()

return current->exp;

}/* 定義乙個polynomial類的友元函式operator+(),

在該函式裡面所有物件都可以訪問polynomial類的私有成員,

注意這個函式不是polynomial類裡面的成員函式

*/polynomial& operator+(polynomial& l, polynomial& r)

lcurrent = lcurrent->link;

rcurrent = rcurrent->link;

} else if (lcurrent->exp < rcurrent->exp)

else

} if (lcurrent != null)

else

while (p != null)

return c;

}polynomial& operator*(polynomial& l, polynomial& r)

lcurrent = l.first->link; newcurrent = c.first;

while (lcurrent != null)

lcurrent = lcurrent->link;

} for (int i = 0; i <= maxexp; i++)

} deleteresult;

return c;

}ostream& operator<

first = false;

out << *current;//自動呼叫ostream&型別的《過載函式operator<

current = current->link;

} return out;

}/*利用尾插法*/

istream& operator >> (istream& in, polynomial& l)

current = current->insertafter(c, e);

} return in;

}

以上**是polynomal.h的內容

#include#include"polynomal.h"

using namespace std;

int main() {

polynomial p1,p2,output1,output2;

cout << "請依次輸入多項式p1的係數與指數!以指數為負為停止標誌" << endl;

cin >> p1;

cout << "您輸入的多項式為:" << endl;

cout < p2;

cout << "您輸入的多項式為:" << endl;

上圖為多項式相乘的結果

利用單鏈表實現多項式的加法和乘法運算

include include typedef struct coeexpstruct coeexp typedef struct polynomial polynode polynode readpolynomial coeexp ce,int size pheadnode pheadnode p...

單鏈表實現多項式相加

include include struct node void destroypoly struct node poly 釋放實現多項式申請的空間 return struct node createnode int coe,int exp 申請空間存放多項式當前項 struct node crea...

單鏈表實現多項式相加

本程式使用鍊錶實現了兩個多項式的相加。多項式的相加主要是考慮相加項的指數是否相同,如果相同則係數相加,指數不變。本程式當中,實現該過程的思想為,在錄入乙個多項式所有項的係數和指數以後,使用鍊錶思想構造一條單鏈表,記作鍊錶a,結 點儲存項的係數和指數。依照此法,構建第二條多項式鍊錶,記作鍊錶b。這樣準...