資料結構鍊錶的學習,以及如何用鍊錶實現乙個棧:
陣列要一塊連續的記憶體空間來儲存,對記憶體的要求比較高。如果我們申請乙個100mb大小的陣列,當記憶體中沒有連續的、足夠大的儲存空間 時,即便記憶體的剩餘總可用空間大於 100mb,仍然會申請失敗。
鍊錶恰恰相反,它並不需要一塊連續的記憶體空間,它通過「指標」將一組零散的記憶體塊串聯起來使用,所以如果我們申請的是 100mb 大小的鍊錶,根本不會有問題。
鍊錶通過指標將一組零散的記憶體塊串聯在一起。其中,我們把記憶體塊稱為鍊錶的「結點」。為了將所有的結點串起來,每個鍊錶的結點除了儲存資料之外,還需要記錄鏈上的下乙個結點 的位址。如圖所示,我們把這個記錄下個結點位址的指標叫作後繼指標 next。
其中有兩個結點是比較特殊的,它們分別是第乙個結點和最後乙個結點。我們習慣性地把第乙個結點叫作頭結點,把最後乙個結點叫作尾結點。其中,頭結點用來記錄鍊錶的基位址。有了它,我們就可以遍歷得到整條鍊錶。而尾結點特殊的地方是:指標 不是指向下乙個結點,而是指向乙個空位址 null,表示這是鍊錶上最後乙個結點。與陣列一樣,鍊錶也支援資料的查詢、插入和刪除操作。只不過效率會不高。
雙向鍊錶需要額外的兩個空間來儲存後繼結點和前驅結點的位址。所以,如果儲存同樣多的資料,雙向鍊錶要比單鏈表占用更多的記憶體空間。雖然兩個指標比較浪費儲存空間,但可以支援雙向遍歷,這樣也帶來了雙向鍊錶操作的靈活性。那相比單鏈表,雙向鍊錶適解決刪除結點中「值等於某個給定值」的結點,刪除給定指標指向的結點。
雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。
1234567
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...
資料結構之鍊錶
頭結點 第乙個有效結點之前的那個結點 頭結點並不存有效資料 加頭結點的目的主要是為了方便對鍊錶的操作 頭指標 指向頭結點的指標變數 尾指標 指向尾節點的指標變數 如果希望通過乙個函式對鍊錶進行處理,只需要乙個引數 頭指標 首先要定義乙個單鏈表儲存結構 然後建立乙個空表,即初始化,我寫的這個提前設定好...
資料結構之鍊錶
鍊錶是一種基本的資料結構型別,它由乙個個結點組成。每乙個結點包括乙個資料的儲存和乙個指向下乙個結點的引用。在這個定義中,結點是乙個可能含有任意型別資料的抽象實體,它所包含的指向結點的應用顯示了它在構造鍊錶之中的作用。和遞迴程式一樣,遞迴資料結構的概念一開始也令人費解,但其實它的簡潔性賦予了它巨大的價...