資料結構實驗 雙向鍊錶及其應用

2021-10-11 01:31:31 字數 3534 閱讀 3458

1.編寫使用freelist的帶頭、尾節點的雙向鍊錶類的定義,實現雙向鍊錶的基本操作。

2.利用雙向鍊錶實現2個一元多項式的加法和乘法運算,運算結果得到的鍊錶要求按照指數降序排列的多項式。

例如:

輸入格式:

3 2 //第一行,兩個正整數分別表示多項式的項數

5 4 //輸入第乙個多項式各項的係數和指數,按指數降序輸入

-3 2

1 0 //第乙個多項式:5x4-3x2+1

6 2 //輸入第二個多項式各項的係數和指數,按指數降序輸入

-3 1 //第二個多項式:6x2-3x

輸出格式:

4 //相加得到的多項式的項數

5 4 //每一項的係數與指數,按指數降序排列輸出

3 2-3 1

1 0 //和:5x4+3x2-3x+1

6 //相乘得到的多項式的項數

30 6

-15 5

-13 4

9 36 2

-3 1 //乘積:30x6-15x5-13x4+9x3+6x2-3x

其實帶頭尾節點的雙向鍊錶實現並不算困難,但是本次實驗重點是在於對freelist的應用。freelist可以看作乙個鏈棧,所有取出、歸還空結點都在一段進行。具體**的說明注釋中已經相當清楚。

**如下:

#include

using namespace std;

//double linked list link node with freelist support

template

class link

link

(link *prevp =

null

, link *nextp =

null

)// destructor

~link()

void

*operator new

(size_t)

//overloaded new operator

//overloaded delete operator

void operator delete

(void

*ptr)};

template

link

*link

::freelist =

null

;// 將freelist置為空

template

class doublelist

public:

doublelist()

//constructor

~doublelist()

//destructor

//清空函式,套用書上鏈表示例中的removeall函式

void

removeall()

//return link nodes to free store

}void

(const e &xishu,

const e &zhishu)

//得到鍊錶中有效項的個數的函式

intgetlength()

return xiangshu;

}// 運算子過載

void operator=

(doublelist &d)

d.curr = d.head->next;

}// 運算子過載,方便main函式輸出

friend ostream &operator<<

(ostream &os, doublelist d)

//項數輸出

os << xiangshu << endl;

//格式化輸出係數和次數

for(d.curr = d.head->next; d.curr->next !=

null

; d.curr = d.curr->next)

return os;}}

;

具體實現直接看**,注意**當中係數和次數的處理

**如下:

#include

#include

"doublelist.h"

using namespace std;

void

add(doublelist<

int>

&d1, doublelist<

int>

&d2, doublelist<

int>

&temp)

;void

multiple

(doublelist<

int>

&d1, doublelist<

int>

&d2, doublelist<

int>

&multiresult)

;int

main()

for(

int i =

0; i < secondxiangshu; i++

)add

(d1, d2, addresult)

; cout << addresult;

multiple

(d1, d2, multipleresult)

; cout << multipleresult;

return0;

}//相加函式

void

add(doublelist<

int>

&d1, doublelist<

int>

&d2, doublelist<

int>

&temp)

else

else

else

else}}

}}//當兩者都處於隊尾時,遍歷完成,即可退出while迴圈if(

(d1.curr == d1.tail)

&&(d2.curr == d2.tail)

)break;}

d1.curr = d1.head;

d2.curr = d2.head;

temp = result;

}//相乘函式

//由於在輸入時是以次數降序排序,因此可以直接進行兩個鍊錶遍歷相乘,而不需要進行再次排序

void

multiple

(doublelist<

int>

&d1, doublelist<

int>

&d2, doublelist<

int>

&multiresult)

//使用add函式將次數相同的項合併

add(temp, multiresult, multiresult)

; d1.curr = d1.curr->next;

}}

4

5 43 2

-3 1

1 06

30 6

-15 5

-18 4

9 36 2

-3 1

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...