單向連結串列（又名單鏈表、線性連結串列， 英語：singly linked list）是連結串列的一種，其特點是連結串列的連結方向是單向的，對連結串列的訪問要透過從頭部開始，依序往下讀取。 資料結構 一個單向連結串列的節點被分成兩個部分。第一個部分儲存或者顯示關於節點的資訊，第二個部分儲存下一個節點的地址。單向連結串列只可向一個方向遍歷。 動態單連結串列（C 語言） 單向連結串列的資料結構可以分為兩部分：資料域和指標域，資料域儲存資料，指標域指向下一個儲存節點的地址。 儲存結構 c22h 線性表的單鏈表儲存結構 typedef struct LNode ElemType data struct LNode next LNodeLinkList 基本操作 bo22c 帶有頭結點的單鏈表 儲存結構由 c22h 定義 的基本操作 12 個 包括演算法 2829210 void InitList LinkList L 操作結果：構造一個空的線性表 L LLinkList malloc sizeof struct LNode 產生頭結點，並使 L 指向此頭結點 if L 儲存分配失敗 exit OVERFLOW LnextNULL 指標域為空 void DestroyList LinkList L 初始條件：線性表 L 已存在。操作結果：銷燬線性表 L LinkList q while L qLnext free L Lq void ClearList LinkList L 不改變 L 初始條件：線性表 L 已存在。操作結果：將 L 重置為空表 LinkList pq pLnext p 指向第一個結點 while p 沒到表尾 qpnext free p pq LnextNULL 頭結點指標域為空 Status ListEmpty LinkList L 初始條件：線性表 L 已存在。操作結果：若 L 為空表，則返回 TRUE，否則返回 FALSE if Lnext 非空 return FALSE else return TRUE int ListLength LinkList L 初始條件：線性表 L 已存在。操作結果：返回 L 中資料元素個數 int i0 LinkList pLnext p 指向第一個結點 while p 沒到表尾 i ppnext return i Status GetElem LinkList Lint iElemType e 演算法 28 L 為帶頭結點的單鏈表的頭指標。當第 i 個元素存在時，其值賦給 e 並返回 OK，否則返回 ERROR int j1 j 為計數器 LinkList pLnext p 指向第一個結點 while pjnext j if pji 第 i 個元素不存在 return ERROR epdata 取第 i 個元素 return OK int LocateElem LinkList LElemType eStatus compareElemTypeElemType 初始條件：線性表 L 已存在，compare 是資料元素判定函式 滿足為 1，否則為 0 操作結果：返回 L 中第 1 個與 e 滿足關係 compare 的資料元素的位序。 若這樣的資料元素不存在，則返回值為 0 int i0 LinkList pLnext while p i if compare pdatae 找到這樣的資料元素 return i ppnext return 0 Status PriorElem LinkList LElemType cur_eElemType pre_e 初始條件：線性表 L 已存在 操作結果：若 cur_e 是 L 的資料元素，且不是第一個，則用 pre_e 返回它的前驅， 返回 OK；否則操作失敗，pre_e 無定義，返回 INFEASIBLE LinkList qpLnext p 指向第一個結點 while pnext p 所指結點有後繼 qpnext q 為 p 的後繼 if qdatacur_e pre_epdata return OK pq p 向後移 return INFEASIBLE Status NextElem LinkList LElemType cur_eElemType next_e 初始條件：線性表 L 已存在 操作結果：若 cur_e 是 L 的資料元素，且不是最後一個，則用 next_e 返回它的後繼， 返回 OK 否則操作失敗，next_e 無定義，返回 INFEASIBLE LinkList pLnext p 指向第一個結點 while pnext p 所指結點有後繼 if pdatacur_e next_epnextdata return OK ppnext return INFEASIBLE Status ListInsert LinkList Lint iElemType e 演算法 29。不改變 L 在帶頭結點的單鏈線性表 L 中第 i 個位置之前插入元素 e int j0 LinkList pLs while pjnext j if pji1 i 小於 1 或者大於表長 return ERROR sLinkList malloc sizeof struct LNode 生成新結點 sdatae 插入 L 中 snextpnext pnexts return OK Status ListDelete LinkList Lint iElemType e 演算法 210。不改變 L 在帶頭結點的單鏈線性表 L 中，刪除第 i 個元素，並由 e 返回其值 int j0 LinkList pLq while pnextjnext j if pnextji1 刪除位置不合理 return ERROR qpnext 刪除並釋放結點 pnextqnext eqdata free q return OK void ListTraverse LinkList Lvoid viElemType vi 的形參型別為 ElemType，與 bo21c 中相應函式的形參型別 ElemType 不同 初始條件：線性表 L 已存在。操作結果：依次對 L 的每個資料元素呼叫函式 vi LinkList pLnext while p vi pdata ppnext printf n 靜態單鏈表（C 語言） 線性表的靜態單鏈表儲存結構 define MAX_SIZE 100 連結串列的最大長度 typedef struct ElemType data 此處的 ElemType 可以自由代換（如 intfloat 等） int cur component SLinkList MAX_SIZE 一個數組只生成一個靜態連結串列的基本操作 11 個 define DestroyList ClearList DestroyList 和 ClearList 的操作是一樣的 void InitList SLinkList L 構造一個空的連結串列 L，表頭為 L 的最後一個單元 L MAX_SIZE1，其餘單元鏈成 一個備用連結串列，表頭為 L 的第一個單元 L 0，0 表示空指標 int i L MAX_SIZE 1cur 0 L 的最後一個單元為空連結串列的表頭 for i 0 i MAX_SIZE 2 i 將其餘單元連結成以 L 0 為表頭的備用連結串列 L icur i 1 L MAX_SIZE 2cur 0 void ClearList SLinkList L 初始條件：線性表 L 已存在。操作結果：將 L 重置為空表 int i j k i L MAX_SIZE 1cur 連結串列第一個結點的位置 L MAX_SIZE 1cur 0 連結串列空 k L 0cur 備用連結串列第一個結點的位置 L 0cur i 把連結串列的結點連到備用連結串列的表頭 while i 沒到連結串列尾 j i i L icur 指向下一個元素 L jcur k 備用連結串列的第一個結點接到連結串列的尾部 Status ListEmpty SLinkList L 若 L 是空表，返回 TRUE；否則返回 FALSE if L MAX_SIZE 1cur 0 若為空表 return TRUE else return FALSE int ListLength SLinkList L 返回 L 中資料元素個數 int j 0 i L MAX_SIZE 1cur i 指向第一個元素 while i 沒到靜態連結串列尾 i L icur 指向下一個元素 j return j Status GetElem SLinkList L int i ElemType e 用 e 返回 L 中第 i 個元素的值 int l k MAX_SIZE 1 k 指向表頭序號 if i 1 i ListLength L return ERROR for l 1 l i l 移動到第 i 個元素處 k L kcur e L kdata return OK int LocateElem SLinkList L ElemType e 演算法 213 有改動 在靜態單鏈線性表 L 中查詢第 1 個值為 e 的元素。若找到，則返回它在 L 中的 位序，否則返回 0。與其它 LocateElem 的定義不同 int i L MAX_SIZE 1cur i 指示表中第一個結點 while i L idata e 在表中順鏈查詢 e 不能是字串 i L icur return i Status PriorElem SLinkList L ElemType cur_e ElemType pre_e 初始條件：線性表 L 已存在 操作結果：若 cur_e 是 L 的資料元素，且不是第一個，則用 pre_e 返回它的前驅， 否則操作失敗，pre_e 無定義 int j i L MAX_SIZE 1cur i 指示連結串列第一個結點的位置 do 向後移動結點 j i i L icur while i cur_e L idata if i 找到該元素 pre_e L jdata return OK return ERROR Status NextElem SLinkList L ElemType cur_e ElemType next_e 初始條件：線性表 L 已存在 操作結果：若 cur_e 是 L 的資料元素，且不是最後一個，則用 next_e 返回它的後繼 否則操作失敗，next_e 無定義 int j i LocateElem L cur_e 在 L 中查詢第一個值為 cur_e 的元素的位置 if i L 中存在元素 cur_e j L icur cur_e 的後繼的位置 if j cur_e 有後繼 next_e L jdata return OK cur_e 元素有後繼 return ERROR L 不存在 cur_e 元素，cur_e 元素無後繼 Status ListInsert SLinkList L int i ElemType e 在 L 中第 i 個元素之前插入新的資料元素 e int l j k MAX_SIZE 1 k 指向表頭 if i 1 i ListLength L 1 return ERROR j Malloc L 申請新單元 if j 申請成功 L jdata e 賦值給新單元 for l 1 l i l 移動 i1 個元素 k L kcur L jcur L kcur L kcur j return OK return ERROR Status ListDelete SLinkList L int i ElemType e 刪除在 L 中第 i 個數據元素 e，並返回其值 int j k MAX_SIZE 1 k 指向表頭 if i 1 i ListLength L return ERROR for j 1 j i j 移動 i1 個元素 k L kcur j L kcur L kcur L jcur e L jdata Free L j return OK void ListTraverse SLinkList L void viElemType 初始條件：線性表 L 已存在。操作結果：依次對 L 的每個資料元素呼叫函式 vi int i L MAX_SIZE 1cur 指向第一個元素 while i 沒到靜態連結串列尾 vi L idata 呼叫 vi i L icur 指向下一個元素 printf n Category 資料結構