鍊錶的幾個介面實現

2021-09-29 20:20:47 字數 1787 閱讀 6411

在這篇部落格介紹一下資料結構線性表鍊錶的幾個介面實現,話不多說,進入正題。

頭插法

頭插法是鍊錶的幾大介面之一,在進入頭插時也得考慮有沒有節點讓你頭插,如果沒有就創造乙個節點。所以先給出乙個創造節點的函式:

slistnode* buyslistnode(sldatatype x)//創造乙個新的節點

如果已經有節點的話,進行正常的頭插順序,**如下:

void slistpushfront(slistnode**pplist, sldatatype x)//頭插法

else

}

頭刪法:

在頭刪的時候同樣也得考慮節點的數量,如果只有乙個直接返回就好了,如果有乙個的話,正常刪除,釋放節點(因為時動態申請開闢的)以及置空。如果有兩個及兩個以上的節點的話:先保留下乙個節點再進行釋放置空。**如下:

void slistpopfront(slistnode**pplist)//頭刪法

else

if(tail->next == null)

else

}

尾插法

尾插法,一定要考慮節點的個數,如果乙個節點都沒有的話,那麼和頭插的步驟一樣。如果不是乙個節點的話,判斷每個節點的next為不為空,不為空則指向下乙個,如果為空的話直接進行尾插,讓最後乙個節點的next指向新節點就好了。

**如下:

void slistpushback(slistnode**pplist, sldatatype x)//尾插法

else

tail->next = newnode;

}}

按理說newnode也應該的next也應該指向空,但是他是經過開闢函式開闢出來的,裡面已經直接指向了null,所以不用寫。

尾刪法

考慮節點數量,考慮節點數量,考慮節點數量,重要的事情說三遍,在進行尾刪的時候,也應該考慮這個事情,如果只有乙個節點應該怎麼辦呢?如果根本沒有節點該怎麼辦呢?我們大多數內心潛意識中都在做第三鐘選擇:有兩個或者兩個以上的節點這種情況。還有在尾刪的時候,直接把最後乙個節點刪除後就可以了麼?指向它的前乙個的指標還是指向它的啊,這樣這個指標不是就成為了野指標了麼?在不帶頭並且不迴圈的單鏈表中,刪除永遠要比插入更加複雜,所以一定要考慮清楚,如果將來面試的時候就因為一種應該考慮的情況沒有被考慮在內而被拒之門外,那真的太可惜了。話不多說,附上**:

void slistpopback(slistnode**pplist)//尾刪法

else

free(tail)

;tail

= null;

prev->next = null;

}}

最後給一下節點的組成

typedef int sldatatype;

typedef struct slistnode

slistnode;

以上就是在資料結構中關於鍊錶四個介面的簡單演示。希望給位大佬多多指正,看完的小夥伴可能對於我頭插和尾插函式裡面的引數有疑問,為什麼我給的是二級指標,因為我要修改節點裡面的內容,**pplist傳過來要使用pplist,必須得解引用看裡面的值。所以為plist,如果傳plist過來,無法把值送過去也送過來,在這一塊指標形參和實參傳遞這一塊以後我也會寫一篇小部落格介紹一下。

幾個鍊錶的題目

找到了個不錯的提綱,做了些反轉鍊錶的題目 迴圈和遞迴,以下三段分別為定義,迴圈,遞迴 1,遞迴 2 function listbode val function reverselist head return pre function reverselist head function revers...

資料結構 鍊錶介面實現

鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 鍊錶與陣列 本篇部落格講解的是單向 非迴圈鍊錶的介面實現 pragma once 預處理指令 只編譯一次 定義鍊錶中每乙個 結點 的結構體 typedef struct slistnode slis...

帶頭雙向鍊錶介面的實現

帶頭雙向鍊錶 include include include typedef int datatype typedef struct listnodelistnode typedef struct twolisttwolist 初始化 void twolistinit twolist pt 銷毀 v...