單向鍊錶和雙向鍊錶的原理及其相關實現

2021-06-28 21:51:31 字數 2771 閱讀 1299

其實要解決乙個問題得從以下幾個方面入手?即在日常生活中的幾大「w」,鍊錶是什麼?它有什麼作用?怎麼實現?在日常生活中有哪些實際應用?只要解決了這些問題,那麼鍊錶這個問題就會很清晰明了了。

(一)什麼是鍊錶?

鍊錶是線性表的一種,所謂的線性表包含順序線性表和鍊錶,順序線性表是用陣列實現的,在記憶體中有順序排列,通過改變陣列大小實現。而鍊錶不是用順序實現的,用指標實現,在記憶體中不連續。意思就是說,鍊錶就是將一系列不連續的記憶體聯絡起來,將那種碎片記憶體進行合理的利用,解決空間的問題。

所以,鍊錶允許插入和刪除表上任意位置上的節點,但是不允許隨即訪問。鍊錶有很多種不同的型別:單向鍊錶、雙向鍊錶及迴圈鍊錶。

1、那麼先從單向鍊錶著手,先看看單向鍊錶的模擬圖:

單向鍊錶包含兩個域,乙個是資訊域,乙個是指標域。也就是單向鍊錶的節點被分成兩部分,一部分是儲存或顯示關於節點的資訊,第二部分儲存下乙個節點的位址,而最後乙個節點則指向乙個空值。

2、雙向鍊錶:

從上圖可以很清晰的看出,每個節點有2個鏈結,乙個是指向前乙個節點(當此鏈結為第乙個鏈結時,指向的是空值或空列表),另乙個則指向後乙個節點(當此鏈結為最後乙個鏈結時,指向的是空值或空列表)。意思就是說雙向鍊錶有2個指標,乙個是指向前乙個節點的指標,另乙個則指向後乙個節點的指標。

3、迴圈鍊錶:

迴圈鍊錶就是首節點和末節點被連線在一起。迴圈鍊錶中第乙個節點之前就是最後乙個節點,反之亦然。

參考:鍊錶

(二)鍊錶有什麼作用?

鍊錶本質上就是一種資料結構,主要用來動態放置資料。也可用來構建許多資料結構,比如堆疊、佇列及它們的派生。

(三)鍊錶的實現?

1、單向鍊錶的實現

(1)單向鍊錶的建立過程:

第一步:定義節點的資料結構;

第二步:建立乙個空表。

第三步:利用malloc()向系統申請分配乙個節點。

第四步:將新節點的指標成員賦值為空。若是空表,將新節點連線到表頭;若是非空表,將新節點連線到表尾。

第五步:判斷是否有後續節點,如有則轉入第三步,否則結束。

(2)單向鍊錶的輸出過程:

第一步:找到表頭。

第二步:若為非空表,則輸出節點的值成員,是空表則退出。

第四步:轉到第二步。

#include #include struct date//申明結構體

;int main()

scanf("%c",&temp);

while (temp != '#')

printf("\n剛才輸入的是:\n");

rhead = head;//取得鏈頭

/* 當然也可以直接用head不過這樣就會改變其值,而無法再次查詢鍊錶

切忌鏈頭的重要性,只要找不到鏈頭,整條鍊錶就沒用!

*/ while (rhead != null)//迴圈到鏈尾 }

printf("\n");

getch();

return 0;

}

以上程式**參考比起其他實現,這個很直觀明了。

2、雙向鍊錶的實現

#include"stdio.h"

#include"stdlib.h"

typedef int datatype;//雙向鍊錶中資料的型別

typedef struct dnode

dnode,*doublelist;//定義雙向鍊錶中乙個節點

doublelist createdlist()//建立雙向鍊錶

// p1

else

scanf("%d",&data);

while(data!=0)

//節點依次連線到雙向鍊錶的尾部

return head;

}

doublelist deldlist(doublelist head,datatype data)//刪除鍊錶某個節點,該節點的值等於data

if(data==0)

p=head;//讓p指向頭結點,p在雙向鍊錶上移動,完成相應的操作

while(p!=null&& p->element!=data)//用p->element!=data而不是p->element=data,

if(p!=null)

else

else //中間某個節點上找到了要刪除的節點 }

} else

return head;

}void printdlist(doublelist head)

printf("\n");

}void freedlist(doublelist head)

while(head!=null) }

int main(void)

以上經cfree5驗證通過了的。

單向鍊錶和雙向鍊錶

1.單向鍊錶 單向鍊錶只可向乙個方向遍歷。查詢乙個節點的時候需要從第乙個節點開始每次訪問下乙個節點,一直訪問到需要的位置。也可以提前把乙個節點的位置另外儲存起來,然後直接訪問。2.雙向鍊錶 可以從任何乙個節點訪問前乙個節點,也可以訪問後乙個節點,以至整個鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中...

單向鍊錶和雙向鍊錶

一 鍊錶是什麼?單向鍊錶linked list 是一種在物理上非連續 非順序的資料結構,由若干節點 node 所組成。而節點包括兩部分,一部分是存放資料的變數data,另一部分是指向下乙個節點的指標next。鍊錶的第1個節點被稱為頭節點,最後1個節點被稱為尾節點,尾節點的next指標指向空。注意 鍊...

單向鍊錶和雙向鍊錶區別 雙向鍊錶

一開始確實被這個雙向鍊錶整暈了,node裡面不停套node,簡直無限套娃,讓人不知道該怎麼下手。後來看了資料結構與演算法分析這本書的 才算整明白。我把鍊錶分成了三個部分 第一部分是node.node是乙個由兩根指標,以及我們需要儲存的資料構成的結構體。這個node就是無限套娃的起源,也是鍊錶用於儲存...