資料結構 列表 鍊錶

2021-10-09 09:35:51 字數 3548 閱讀 3388

2 listnode模板類

3 list物件

4 無序列表

5 有序列表

6 列表排序

自學 鄧俊輝《資料結構(c++語言版)》第三章——列表,且結合leetcode題庫進行簡單練習。

leetcode習題分類可參考此github

以上github中煉表練習題及**總結點這裡

《資料結構(c++語言版)》電子版pdf獲取方式:

資料空間整體建立或銷毀,資料元素的物理儲存次序與其邏輯次序嚴格一致,可支援高效的靜態操作;

向量支援循秩訪問(call-by-rank)的方式,根據資料元素的秩,可以在o(1)時間內直接確定其實體地址;

列表為各元素動態地分配和**實體地址,在邏輯上相鄰的元素記錄彼此的實體地址,在邏輯上形成乙個整體,支援高效的動態操作,支援循位置訪問(call-by-position)的方式。

// listnode模板類,即為list資料結構物件中的每乙個元素

typedef int rank;

#define listnodeposi(t) listnode* //列表節點位置

哨兵節點。那麼這個哨兵節點有什麼作用呢?引用哨兵節點能簡化演算法的描述與實現,避免對各種分界退化情況做專門處理。在下面的插入、刪除操作中可以體現它的作用。

建立乙個list物件時,在列表內部建立一對頭、尾哨兵節點,並設定其前驅、後繼指標構成乙個雙向鍊錶。

void list

::init(

)

由秩到位置的轉換:通過秩來指定列節點,可通過過載操作符「」:

無序列表的唯一化:deduplicate()

// 插入節點

listnodeposi(t) listnode

::insertaspred(t const& e)

其中的兩條語句pred->succ = x; pred = x;不能顛倒順序!!!否則不能成功插入節點,原列表的結構會被破壞。

有序列表的唯一化:uniquify()

插入排序 insertion sort適用於包括向量與列表在內的任何序列結構。

思路:始終將整個序列視作並切分為兩部分,有序的字首 s[0, r) 和無序的字尾 s[r, n);通過迭代,反覆地將字尾的首元素轉移到字首中。

在任何時刻,相對於當前節點 e=s[r], 字首 s[0, r) 總是業已有序。

// 插入排序

template

//列表的插入排序:對起始於位置 p 的 n 個元素排序

void list

::insertionsort( listnodeposi(t) p,

int n)

// 僅使用o(

1)輔助空間,屬於就地演算法

}//o(n^

2)

選擇排序 selection sort也適用於向量與列表之類的序列結構。

思路:將序列劃分為無序的字首 s[0, r) 及有序的字尾 s[r, n),此後還要求字首中的元素都不大於字尾中的元素。如此,每次只需從字首中選出最大者,並作為最小元素轉移至字尾中,即可使有序部分的範圍不斷擴張。

在任何時刻,字尾s[r,n)已經有序,且不小於字首s[0,r)。

template 

//列表的選擇排序演算法,對起始於位置 p 的 n 個元素排序

void list

::selectionsort ( listnodeposi(t) p,

int n)

}//o(n^2)

template

//從起始於位置 p 的 n 個元素中選出最大者,相同的返回最後者

listnodeposi(t) list

::selectmax( listnodeposi(t) p,

int n)

//o(nlogn)

插入排序和選擇排序的對比:有序序列和無序序列次序的顛倒:選擇排序中,有序部分是字尾,而無序部分是字首,且字首的無序部分都不能超過有序字尾的最小值;而插入排序沒有這樣的限定。

template 

//有序列表的歸併:當前列表中自 p 起的 n 個元素,與列表 l 中自 q 起的 m 個元素歸併

void list

::merge( listnodeposi(t)

&p,int n, list

& l, listnodeposi(t) q,

int m)

else

p = pp-

>succ;

//確定歸併後區間的起點

}template

//列表的歸併排序演算法:對起始於位置 p 的 n 個元素排序

void list

::mergesort( listnodeposi(t)

& p,

int n)

//注意:排序後,p 依然指向歸併後區間的起點 o(nlogn)

歡迎關注【oaoa】

資料結構 鍊錶

鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...

資料結構 鍊錶

鍊錶中的資料是以節點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。鍊錶的結點結構 data next data域 存放結點值的資料域 next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 以 結點的序列 ...

資料結構 鍊錶

一般的建立線性鍊錶有兩種 1.正序法 需要三個指標,head作為頭指標,pre作為前乙個指標,cur作為當前指標用來建立空間 2.倒序法,利用指標的插入,只需要兩個指標,不斷的往頭指標後插入新空間,不過插入的越早,離頭指標越遠,也就越後面輸出 1.線性鍊錶的建立及查詢刪除 include inclu...