這裡以單鏈表為例闡述如何用c++實現表的基本表示:
1)表的結構
通過開始結點a0可以訪問整個表元素,最後的乙個結點的指標為null。
2)引入表頭結點
在實現中,為了實現對各個結點的處理的一致性,引入了乙個頭結點,頭結點是指向鍊錶開始結點a0的結點,這樣一來鍊錶的所有結點都有了前驅結點,開始結點(鍊錶實際結點的第乙個結點)的插入和刪除也就不會特別處理,對空表或非空表的處理也是一致的。引入頭結點後的結構如下:
其中頭結點的資料域可以不儲存任何資料資訊或者儲存如鍊表長度這樣的資料,頭結點的指標指向鍊錶的開始結點。
3)鍊錶的c++表示
根據上面的結構將鍊錶抽象為兩個類:listnode,mylist。listnode封裝了乙個結點的資訊,包含乙個任意資料型別的資料和乙個指向下乙個元素的指標;mylist封裝了乙個鍊錶的資料和行為,mylist通過頭結點表示的,給出了乙個頭結點就相當於給了乙個鍊錶,這裡採用模板類以使鍊錶可以適應各種各樣的資料型別,在vs2010中具體的c++**如下:
1view code/*listnode.h*/2
#ifndef listnode_h
3#define listnode_h
45 template class
mylist;
67 template 8
class
listnode917
listnode(t val)
1822
private:23
t data;
24 listnode *next;
25};
2627
#endif
1view code/*mylist.h */2
#ifndef mylist_h
3#define mylist_h
45 #include "
listnode.h"6
7 template
8class
mylist9;
2324
#endif
1view code/*mylist.cpp
*/2 #include "
mylist.h
"3 #include4
using
namespace
std;
56 template
7 mylist::mylist()811
12 template
13 listnode* mylist::find(t val)
1422
return
null;23}
2425 template
26 listnode* mylist::findprev(t val)
2737
return
null;38}
3940 template
41 listnode* mylist:: last()
4248
return
cur;49}
5051 template
52void mylist::insert(listnode*x, t data)
5360}61
62 template
63void mylist::attach(t data)
6468
69 template
70void mylist::delete(t data)
7179}80
81 template
82void mylist::print()
8390 cout<
91 }
1view code/*主程式
*/2 #include "
stdafx.h
"3 #include "
listnode.h
"4 #include "
mylist.h
"5 #include "
mylist.cpp
"6 #include 7
8int _tmain(int argc, _tchar*ar**)
9
當然mylist類中對鍊錶的操作可以包含很多,通常為了使類保持緊湊性,同時為了適應不同的需求和方便使用者新增新的成員函式,可以將對鍊錶的遍歷相關的操作另外封裝為乙個類,這裡就不再細講了,如果有興趣可以參見東南大學金遠平教授編著的《資料結構(c++描述)》第三章(p71)。
在隨後的鍊錶章節中,為了使演算法的表述更加直觀,就將listnode和mylist類中的成員變數設為public許可權。
c語言鍊錶 鍊錶
在儲存一大波數的時候,我們通常使用陣列,但有時候陣列顯得不夠靈活,比如有一串已經從小到大排序好的數 2 3 5 8 9 10 18 26 32 現在需要往這串數中插入6使其得到的新序列仍符合從小到大排列。如果我們使用陣列來實現這一操作,則需要將8和8後面的數字都依次往後挪一位,如果你覺得這幾個數不算...
鍊錶系列 鍊錶環相關問題
設定兩個節點 slow fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。public boolean hascircle node head node slow head node fast head...
c語言 鍊錶 C語言鍊錶例項 玩轉鍊錶
下圖為最一簡單鍊錶的示意圖 第 0 個結點稱為頭結點,它存放有第乙個結點的首位址,它沒有資料,只是乙個指標變數。以下的每個結點都分為兩個域,乙個是資料域,存放各種實際的資料,如學號 num,姓名 name,性別 和成績 score 等。另乙個域為指標域,存放下一結點的首位址。鍊錶中的每乙個結點都是同...