本教程會在以後持續公布c語言資料結構的實現文章,一來重溫一下基礎知識,二來為正在學習此部分內容的同學提供參考和思路,教程內容均來自於書籍、網友分享和本人思考,側重**編寫和實現,詳細的理論論述還是要翻閱經典的書籍,在此感謝貢獻自己智慧型的廣大程式設計人員。
今天的主題是單鏈表,這是一種非常常見的資料結構,隸屬於線性表,是一種簡單的鏈式實現方式,文中會實現我們在面試中經常會碰見的【單鏈表反轉】的問題。鍊錶為了實現前驅和後繼元素之間的邏輯關係,也就是前後位置和聯絡,鍊錶中每個節點除了儲存資料元素之外,還必須儲存其後繼節點的儲存位置,該儲存位置被稱為指標域,相應單純儲存資料的位置被稱為資料域,而指標域和資料域構成乙個鍊錶的基本元素-節點。節點中只有乙個指標域,這種鍊錶就被稱為單鏈表。節點部分通過結構體指標和符號常量來實現,結構體指標主要實現鍊錶的節點結構,定義符號常量可以自定義節點資料域儲存的資料型別,具體實現:
#include
#include
#define eltype int
typedef struct node *node;
eltype為在頭部定義的資料型別,本例以儲存數值型資料為例,next為指向後繼節點的指標,node為指向結構體型別也就是節點型別的指標。有了節點型別,接下來按照一般邏輯需要實現生成鍊錶的功能,**如下:
node createnode(int n)
p->next = null;
return head;
}
createnode函式形參為鍊錶長度,返回值型別為指向node型別的指標,指向的節點為鍊錶的頭節點。迴圈體之前宣告三個node型別資料,head,p,q,head為頭節點指標域指向鍊錶的第乙個節點,p為臨時變數,代表迴圈體中迴圈建立下乙個節點的前驅節點,迴圈體中每次迴圈都建立乙個新的節點,給資料域賦值和設定當前節點p指向新的節點q,然後q賦值給p,進行下一次迴圈,q再去連線新的節點q』(下一次迴圈新建立的節點),在最後一次迴圈中,鍊錶中最後乙個節點q由賦值給了p,所以迴圈體結束後,p的指標域還未賦值,因為尾節點不再指向任何節點,所以其指標域為空,最後返回頭節點,嚴格說是指向頭節點的指標。鍊錶的乙個通用功能是鍊錶節點數值的輸出,**實現如下:
void shownode(node head)
printf("\n");
}
鍊錶輸出就是出入鍊錶的頭節點,順序列印鍊錶的節點值,上邊**段給出兩種迴圈輸出鍊錶節點值的方法。接下來是鍊錶反**
void reversenode(node head)
t->next = p;
head->next = t;
}
理解這段**的關鍵在於弄明白p,t,q的角色,迴圈之前宣告這三個臨時變數,可以這樣理解:按照順序p,t,q分別代表每次迴圈過程中前驅,當前,後繼節點,反轉的核心就是將原來的前驅->當前->後繼 變成 後繼->當前->前驅 對應著就是t->next = p;就將當前->後繼變成當前->前驅,接著p,t,q向下移動乙個節點,進入下一次迴圈,直到t為尾節點,此時q=null,迴圈結束,手動將尾節點指向倒數第二個節點,設定頭節點指向尾節點,這樣尾節點就變成鍊錶中的第乙個節點,整個鍊錶已經反轉完成。檢驗:
int main()
#執行結果
02468
86420
[finished in
0.0s]
驗證結果與預期一致。 C語言 資料結構之單鏈表
本文將實現單鏈表的基礎介面功能 1.初始化 銷毀 2.增刪改查 標頭檔案.h define crt secure no warnings 1 pragma once typedef int sldatatype typedef struct slistnode slistnode typedef s...
c語言 資料結構 單鏈表
將線性表l a0,a1,an 1 中各元素分布在儲存器的不同儲存塊,稱為結點,通過位址或指標建立它們之間的聯絡,所得到的儲存結構為鍊錶結構,表中 ai的結點形式如圖表示 其中結點的data 域存放資料元素 ai,而 next 域是乙個指標,指向 ai的直接後繼 ai 1 所在的結點。單鏈表結構如下 ...
資料結構 單鏈表 C語言
單向鍊錶 鍊錶結點通常包含資料域與指標域,資料域用來儲存相關的使用者的資料,指標域用來指向下乙個結點。訪問單向鍊錶,需要從頭部 head 開始單向順序訪問,訪問終結於指標域 next 為null的結點 其儲存方式不同於以往的陣列,按照非連續位址方式儲存。優點 鍊錶長度可以實現動態增長,不必像陣列一樣...