資料結構(二) 單鏈表

2021-09-29 21:36:10 字數 2539 閱讀 3333

​ 單鏈表是一種鏈式訪問的資料結構,用一組位址任意的儲存單元存放線性表中的資料元素。鏈式儲存不僅需要儲存元素本身,還要儲存乙個指向其後繼元素的位址,這種儲存結構也被稱為 node,儲存資料的叫資料域,儲存位址的叫指標域。

​ 鏈式儲存結構需要存放資料的資料域和存放後繼節點位址的指標域,所以在定義單鏈表時需要如下定義

typedef struct node listnode, linklist;
​ 單鏈表的建立從新插入的元素位置的不同分為頭插法和尾插法

頭插法建立單鏈表

​ 頭插法建立單鏈錶即新插入的元素每次都會作為頭指標 head 的後繼節點,這樣建立單鏈表時,每次插入新元素只需要修改 head 的指標,再讓新節點的 next 指向原 head 指向的節點便可

​ 具體的過程為:先為 head 節點和即將作為下一節點的 p 節點分配記憶體,再為 p 節點的資料域賦值,將 head 原本的 next 指標的值賦值給 p 的 next,再讓 head 的 next 指向 p,這樣就實現了在 head 後和上一次插入的節點前插入新節點的操作,使用 while 迴圈迴圈執行為 p 分配儲存空間及其之後的**,就實現了頭插法建立單鏈表的過程

listnode *creat_linklist() 

head->next = null;

cout << "輸入要錄入的數以0結尾" << endl;

cin >> x;

index++;

while (x != 0)

p->data = x;

p->next = head->next;

head->next = p;

cout << "第% " << index << " %次輸入:" << endl;

cin >> x;

index++;

} return head;

}

尾插法建立單鏈表

​ 尾插法建立單鏈表實際上就是頭插法的反向方法,即每次新插入的節點都會被上一次插入的節點的 next 所指向,節點會按照輸入的順序乙個乙個新增在上乙個結點之後

​ 具體的過程為:先為頭節點分配儲存空間,然後將頭節點的位址賦值給尾節點,這樣在沒進行其他操作之前,可以說頭節點和尾節點是相同的,然後定義 p 節點並為其賦值,令當前的尾節點(第一次迴圈時尾節點就是頭節點,之後的每次迴圈尾節點都會進行後移,所以每次插入新節點都可以想象成在頭節點之後的最新節點和尾節點前新增)指向新節點,再將新節點賦值給尾節點,這裡就是尾節點的後移,再令尾節點的 next 指向空,迴圈這部分的操作就實現了尾插法建立單鏈表

listnode *creat_linklist_r() 

return head;

}

###列印單鏈表

​ 列印單鏈表的操作十分簡單,傳入頭節點位址,定義乙個當前節點位置的 p 節點,通過迴圈讓 p 不停後移來獲取每個節點中存放的資料

int print_list(listnode *head) 

while (p != null)

return 1;

}

###獲取單鏈表長度

int length_list(listnode *head) 

return num;

}

###按照索引查詢元素

​ 原理同獲取單鏈表長度的原理接近,先通過計數器 num 將當前節點 p 移動到索引 i 的位置,再獲取當前節點 p 中存放的資料

listnode *getd_index(listnode *head, int i) 

while ((p->next != null) && (num < i))

if (num == i)

else

return null;

}

###按照元素值查詢元素

​ 通過元素值查詢鍊錶中的資料也是需要通過當前節點 p 的不斷後移,不停的取出每乙個節點中的資料與目標值進行比較,直到找到值或者移動到了鍊錶的結束

int getd_data(listnode *head, int data) 

else

} return 0;

}

###刪除後繼節點

​ 先令 r = p->next,再讓 p->next 指向 r->next,這樣就已經將 p 的後繼節點從鍊錶中摘除了,最後釋放 r 的資源就完成了後繼節點的刪除操作

int deleteafter_linklist(listnode *p)
(一)從儲存結構上來說,順序表存放在一串連續的位址中,而鍊錶的每個節點的儲存位置都是隨機的,所以對鍊錶進行插入、刪除操作時的時間複雜度為 o(1),但是查詢時需要 o(n),相反的,順序表需要平均遍歷一半的資料才能完成相同的插入、刪除操作,複雜度為 o(n),但是查詢卻為 o(1)

(二)從儲存空間上說,順序表需要預先分配好全部的儲存空間,這樣會造成資源的浪費或者不足等問題,而鍊錶可以隨用隨分配,便捷的增刪操作可以快速的為新節點分配儲存空間

資料結構之單鏈表(二)

判斷單鏈表是否有環 思路 設定兩個 指標 乙個走一步,乙個走兩步,若存在環,則一定會存在有相交的位置點 public boolean isloop linklist lnode return false 輸出單鏈表中倒數第k個結點 public void getnode int k node p h...

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...