鍊錶是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 。
鍊錶與陣列
【本篇部落格講解的是單向、非迴圈鍊錶的介面實現】
#pragma once //預處理指令:只編譯一次
//定義鍊錶中每乙個"結點" 的結構體
typedef struct slistnode slistnode;
//定義"鍊錶" 的結構體
typedef struct slist slist;
void
slistinit
(slist *list)
void
slistprint
(slist *list)
printf
("null\n");
}
//找到返回 < 結點的位址 > .沒找到返回 。
//時間複雜度o(n),因為有遍歷操作
slistnode*
slistfind
(slist* list, sldatatype data)
}//否則沒找到
return
null
;}
//時間複雜度o(1)
void
slistpopfront
(slist *list)
如果鍊錶只有乙個結點,執行頭插操作就是進行尾插操作。
但凡鍊錶不是單結點情況,遍歷鍊錶直至倒數第二個結點,然後就可以通過下一結點的指標釋放尾結點的記憶體空間。安全起見將釋放後的記憶體置為null
。
//時間複雜度o(n),因為有遍歷操作,單鏈表
void
slistpopback
(slist *list)
//通常情況 >= 2 個結點
//方案一:
slistnode *cur;
for(cur = list-
>first; cur-
>next-
>next !=
null
; cur = cur-
>next)
;// cur 是倒數第二個結點
free
(cur-
>next)
;//cur->next就變成了無效指標了
cur-
>next =
null
;//方案二:
//也可以建立乙個變數儲存變為null之前的值
/*slistnode *last = cur->next;
cur->next = null;
free(last);*/
}
//時間複雜度o(n),因為有遍歷
void
slisteraseafter
(slistnode *pos)
如果首元素就是此數值,說明首節點就是希望刪除的結點,呼叫頭刪函式。
如果鍊錶中間元素為此數值,將前乙個結點的next
指向本結點的下乙個結點。
void
slistremove
(slist *list, sldatatype data)
//跳出 while 迴圈情況:
//1. cur 為空,表示沒有找到
if(cur ==
null
)//2. 找到資料,cur != null 且 previous == null
//首結點就是目標結點,進行頭刪
if(previous ==
null
)//3. 找到資料,cur != null 且 previous != null
// cur 是中間結點,也是要刪的結點,同時previous是要刪除的前乙個節點
previous-
>next = cur-
>next;
//釋放掉無效記憶體
free
(cur)
;}
//時間複雜度o(1)
void
slistpushfront
(slist *list, sldatatype data)
如果要插入的鍊錶為空:
對空鍊錶進行尾插結點,可以直接呼叫設定好的頭插函式進行操作。
如果要插入的鍊錶非空:
對非空鍊錶進行尾插結點,遍歷鍊錶直到最後乙個結點,將建立好的結點連線在原鍊錶的尾結點之後。
對於新建結點
操作經常使用,所以選擇封裝
成為乙個buyslistnode
函式直接反覆呼叫。
//時間複雜度o(n),因為有遍歷操作,單鏈表
slistnode *
buyslistnode
(sldatatype data)
void
slistpushback
(slist *list, sldatatype data)
//***********************************
//**** 鍊錶中已經有結點的情況 ****
//***********************************
//1. 找到最後乙個結點
slistnode *last = list-
>first;
for(
; last-
>next !=
null
; last = last-
>next)
;//此時last是最後乙個結點
//2. 申請空間
slistnode *node =
buyslistnode
(data)
; last-
>next = node;
}
//時間複雜度o(n),因為有遍歷
void
slistinsertafter
(slistnode *pos, sldatatype data)
//時間複雜度o(n),因為需要遍歷
void
slistdestroy
(slist *list)
list-
>first =
null
;}
最後附上順序表的介面實現:【 】 資料結構 雙向迴圈鍊錶介面實現
我們之前討論的是slist單向鍊錶,即single list。這篇部落格來進行dlist雙向鍊錶,即double list的介面實現。雙向鍊錶的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅,所以它的實現相比於單鏈表簡單了很多,但稍微繁瑣了一些。本篇特指不帶頭 雙向 迴圈鍊錶 鍊錶結點結構體...
為鍊錶資料結構實現iterator介面
為所有的資料結構提供統一的訪問方式。介面物件一共有3個方法,next 方法 return 方法 throw 方法。next 必填 用於for.of迭代。該方法返回乙個物件。value 元素值,done 狀態位,用於指定迴圈是否結束。return 可選 用於break語句,或出錯結束迴圈。throw ...
資料結構鍊錶實現
二 實驗基本原理與設計 三 主要儀器裝置及耗材 四 附錄 利用linux gnu make c 專案管理軟體工具實現資料結構鍊錶 linked list 要求實現以下功能 push,pop,insert,delete,search,visit go through,clear。節點的資料必須具有一般...