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 ...