資料結構之鍊錶

2021-09-20 21:57:20 字數 4240 閱讀 4219

資料結構鍊錶的學習,以及如何用鍊錶實現乙個棧:

陣列要一塊連續的記憶體空間來儲存,對記憶體的要求比較高。如果我們申請乙個100mb大小的陣列,當記憶體中沒有連續的、足夠大的儲存空間 時,即便記憶體的剩餘總可用空間大於 100mb,仍然會申請失敗。

鍊錶恰恰相反,它並不需要一塊連續的記憶體空間,它通過「指標」將一組零散的記憶體塊串聯起來使用,所以如果我們申請的是 100mb 大小的鍊錶,根本不會有問題。

鍊錶通過指標將一組零散的記憶體塊串聯在一起。其中,我們把記憶體塊稱為鍊錶的「結點」。為了將所有的結點串起來,每個鍊錶的結點除了儲存資料之外,還需要記錄鏈上的下乙個結點 的位址。如圖所示,我們把這個記錄下個結點位址的指標叫作後繼指標 next。

其中有兩個結點是比較特殊的,它們分別是第乙個結點和最後乙個結點。我們習慣性地把第乙個結點叫作頭結點,把最後乙個結點叫作尾結點。其中,頭結點用來記錄鍊錶的基位址。有了它,我們就可以遍歷得到整條鍊錶。而尾結點特殊的地方是:指標 不是指向下乙個結點,而是指向乙個空位址 null,表示這是鍊錶上最後乙個結點。與陣列一樣,鍊錶也支援資料的查詢、插入和刪除操作。只不過效率會不高。

雙向鍊錶需要額外的兩個空間來儲存後繼結點和前驅結點的位址。所以,如果儲存同樣多的資料,雙向鍊錶要比單鏈表占用更多的記憶體空間。雖然兩個指標比較浪費儲存空間,但可以支援雙向遍歷,這樣也帶來了雙向鍊錶操作的靈活性。那相比單鏈表,雙向鍊錶適解決刪除結點中「值等於某個給定值」的結點,刪除給定指標指向的結點。

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

114115

116117

118119

120121

122123

124125

126127

128129

130131

132133

134135

136137

138139

140141

142143

144145

146147

148149

150

public

class

linkedlist

public

node

(e e)

public

node

()@override

public string tostring()}

private node dummyhead;

private

int size;

public

linkedlist

()public

intgetsize

()public

boolean

isempty

()//為煉表頭新增新的元素e

public

void

addfirst

(e e)

//在鍊錶的index(0-based)位置新增新的元素e

//鍊錶中不是乙個常用的操作

public

void

add(int index, e e)

node prev = dummyhead;

for (int i = 0; i < index; i++)

prev.next = new node(e, prev.next);

size++;

}public

void

addlast

(e e)

public e get

(int index)

node cur = dummyhead.next;

for (int i = 0; i < index; i++)

return cur.e;

}//獲取鍊錶的第乙個元素

public e getfirst

()//獲取鍊錶的最後乙個元素怒

public e getlast

()//修改鍊錶的index元素(0-based)個位置的元素

//不常用的操作

public

void

set(int index, e e)

else

cur.e = e;}}

//查詢鍊錶是否存在元素e

public

boolean

contains

(e e)

cur = cur.next;

}return

false;

}public e remove

(int index)

else

node retnode = prev.next;

prev.next = retnode.next;

retnode.next = null;

size--;

return retnode.e;}}

public e removefirst

()public e removelast

()@override

public string tostring

()return res.tostring();}}

測試

資料結構 表之煉表

頭插法建立 尾插法建立 顯示 銷毀 include include using namespace std typedef int elemtype typedef struct lnode linklist void createlinklistf linklist l,elemtype a,in...

資料結構之鍊錶

頭結點 第乙個有效結點之前的那個結點 頭結點並不存有效資料 加頭結點的目的主要是為了方便對鍊錶的操作 頭指標 指向頭結點的指標變數 尾指標 指向尾節點的指標變數 如果希望通過乙個函式對鍊錶進行處理,只需要乙個引數 頭指標 首先要定義乙個單鏈表儲存結構 然後建立乙個空表,即初始化,我寫的這個提前設定好...

資料結構之鍊錶

鍊錶是一種基本的資料結構型別,它由乙個個結點組成。每乙個結點包括乙個資料的儲存和乙個指向下乙個結點的引用。在這個定義中,結點是乙個可能含有任意型別資料的抽象實體,它所包含的指向結點的應用顯示了它在構造鍊錶之中的作用。和遞迴程式一樣,遞迴資料結構的概念一開始也令人費解,但其實它的簡潔性賦予了它巨大的價...