資料結構 鍊錶介面實現

2021-09-11 10:47:37 字數 3553 閱讀 1963

鍊錶是一種物理儲存結構上非連續非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 。

鍊錶與陣列

【本篇部落格講解的是單向、非迴圈鍊錶的介面實現】

#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。節點的資料必須具有一般...