鍊錶是一種資料結構,你可以把它想象成一種動態的陣列,此陣列大小不固定,可以在需要時動態增加、刪除元素。它解決了使用陣列時大小固定不可更改的痛點。
如上圖所示,單向鍊錶主要由乙個乙個節點組成。每個節點包含乙個值value
和乙個指標* next
,值value
用於儲存鍊錶中的數值,指標* next
用於指向下乙個節點。
定義乙個指標* head
用於指向煉表頭節點。
頭節點的作用:表示單向鍊錶的頭部(不存放具體資料)。
設定最後乙個節點的* next
的位址為null
,表示鍊錶末尾。
使用結構體定義鍊錶節點:
typedef
struct _node
node;
隨後,將整個鍊錶做一封裝:
typedef
struct _list list;
//list可以代表整個鍊錶
node*
createnode
(datatype value)
初始化部分,將煉表頭 *head 設定為 null。
void
initlist
(list* plist)
尾插,首先我們要建立乙個新節點,然後判斷鍊錶當前是否有節點,若沒有,則直接讓第乙個節點指向新節點,若有,找到最後乙個節點,讓他指向新節點。
void add_at_end (list* plist, datatype value)
last->next = pnewnode;
//找到原鍊錶末尾節點,讓其指向已申請的新節點
}else
}
在給定pos位置後插入值為value的節點,分兩步完成:首先找到pos位置的節點,然後再插入,所以要實現這乙個功能需要兩個函式來共同完成。
注意:應該先連線好新節點,再斷開原來的指標指向。
void
add_at_pos
(node* pos, datatype value)
pnewnode =
createnode
(value)
;
pnewnode->next = pos->next;
pos->next = pnewnode;
}
尾刪,首先判斷鍊錶中有沒有節點,若沒有,直接返回,若有乙個節點,直接讓第乙個節點指向null,若有多個節點,則需要記錄下倒數第二個節點,讓它指向null。
;}要分三種情況:鍊錶為空直接返回、要刪除的節點為第乙個節點、其它位置的節點。
void
del(list* plist, datatype value)
node* ppre =
null
; node* pcur = plist->head;
while
(pcur)
else
free
(pcur)
;return;}
else
}}
更改pos位置節點的value值。
void
changevalue
(node* pos, value)
根據指定的value值,找到對應的節點。
node*
findnode
(list* plist, datatype value)
pcur = pcur->next;
}return
null
;}
void
printlist
(list *plist)
printf
("\n");
}
void
destorylist
(list *plist)
while
(plist->head)
}
鍊錶 反轉單向鍊錶
思路 從第二個元素開始。1 刪除當前元素。2 把當前元素放到頭結點位置。其中需要宣告3個變數 headnode 頭結點 prenode 前乙個結點 currentnode 當前結點 具體步驟如圖所示 實現 反轉單鏈表方法實現類 created by liujinjin on 17 1 19.publ...
鍊錶1 單向鍊錶
鍊錶中最簡單的一種是單向鍊錶,它包含兩個域,乙個資料域和乙個指標域,指標域指向鍊錶中的下乙個節點,最後乙個節點的指標域指向乙個空值 鍊錶最基本的結構是在每個節點儲存資料和到下乙個節點的位址,在最後乙個節點儲存乙個特殊的結束標記,另外在乙個固定的位置儲存指向第乙個節點的指標,有的時候也會同時儲存指向最...
鍊錶 單向鍊錶
討論單鏈表之前,我們先來討論下面這個問題。順序表存在的一些問題 中間 頭部的插入刪除,時間複雜度為o n 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗。增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以後增容到200,我們再繼續插入了5個資料,後面沒有資料插入了...