課程筆記 08 資料結構(清華) 列表 讀寫介面

2021-07-04 00:18:27 字數 1999 閱讀 8812

在介紹循位置訪問、查詢元素等唯讀操作以及插入、刪除、去重等可寫操作前,先講講初始化方法與複製建構函式的實現。

void list::init()

header = new listnode;

tailor = new listnode;

header.succ = tailor; header.pred  = null;

tailor.pred = header; tailor.succ = null;

_size = 0;

而複製函式的實現如下:

void list::copynodes(listnodeposi(t) p, int n) //p合法,且至少有n-1個真後繼節點

init(); //建立頭、尾哨兵節點並做初始化

while ( n -- ) //將起自p起的n項依次作為末節點插入

insertaslast(p.data);

p = p.succ;

以下是基於複製方法的初始化:

list::list(listnodeposi(t) p, int n) 

//複製列表中自位置p起的n項

list::list(listconst& l)

//整體複製列表l

list::list(listconst& l, int r, int n)

為了延續向量中循秩訪問的形式,我們需要過載操作符。

t & list::operator(rank r)

listnodeposi(t) p = first();

while (-- r) p = p.succ;

return p.data;

針對無序列表的查詢功能實現如下:

listnodeposi(t) find (t const &e, int n, listnodeposi(t) p) const

while (0 < n--) //對於p最近的n個前驅,從右向左

if (e == (p = p->pred)->data) 

return p; //逐個比對,直至命中或範圍越界

return null; //p越出左邊界意味著區間內不含e,查詢失敗

列表的插入分為以下幾種。

listnodeposi(t) list::insertasfirst(t const& e) //e當作首節點插入

listnodeposi(t) list::insertaslast(t const& e)

//e當作末節點插入

listnodeposi(t) list::insertbefore(listnodeposi(t) p, t const& e)

//e當作p的前驅插入

listnodeposi(t) list::insertafter(listnodeposi(t) p, t const& e)

//e當作p的後繼插入

刪除演算法的實現如下:

t list::remove(listnodeposi(t) p) //刪除除合法位置p處節點,返回回其數值

t e = p->data; //備份待刪除節點的數值(假定t型別可直接賦值)

p->pred->succ = p->succ; p->succ->pred = p->pred; //後繼、前驅

delete p; _size--; //釋放節點,更新規模

return e; //返回備份的數值

}以下是無序列表的去重操作:

int list::deduplicate() //剔除無序列表中的重複節點

if (_size < 2) return 0; //平凡列表自然無重複

int oldsize = _size; //記錄原規模

listnodeposi(t) p = header; rank r = 0; //p從首節點開始

while (trailer != (p = p->succ)) //assert: 迴圈過程中的任意時刻,p的所有前驅互不相等

return oldsize - _size; //列表規模變化量,即被刪除元素總數

課程筆記 02 資料結構(清華) 向量

向量是陣列的擴張。二者同是採用順序儲存方式的資料型別,所不同的是向量的封裝性好 抽象度高,具有更好的安全效能與更多的操作介面。在c 環境下,向量模板類可以如下定義 typedef int rank 定義秩 define defualt capacity 定義預設容量 template class v...

課程筆記 05 資料結構(清華) 向量 排序

起泡排序 先來看起泡排序的一般版本 template void vector bubblesort rank lo,rank hi 演算法框架 逐趟做掃瞄交換 bool vector bubble ranklo,rank hi 單趟掃瞄交換 bool sorted true 整體有序標誌 while...

資料結構 列表

列表中的元素是怎麼進行儲存的?列表或陣列在建立時,會開闢一塊連續的記憶體空間,長度定死了 查詢 1 複雜度o 1 插入 複雜度o n 刪除 複雜度o n 陣列和列表有兩點區別 陣列長度固定,陣列內元素型別一樣 由於不同型別的資料儲存空間大小不一樣,為了減少這樣不確定性,就規定了元素型別必須一致 陣列...