其實要解決乙個問題得從以下幾個方面入手?即在日常生活中的幾大「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就是無限套娃的起源,也是鍊錶用於儲存...