數據結構 鏈表_單鏈表的接口定義
鏈表可以說是一種最為基礎的數據結構。鏈表由一組元素以一種特定的順序組合或鏈接而成,在維護數據的集合時很有用。這一點同我們常用的數組很相似。然而,鏈表在很多情況下比數組更有優勢。特別是在執行插入和刪除操作時鏈表擁有更高的效率。鏈表需要動態的開辟存儲空間,也就是存儲空間是在程序運行時分配的。由於在很多應用中數據的大小在編譯時並不能確定,因此這種動態分配空間的特性也是鏈表的一個優點。
單鏈表介紹
單鏈表(簡稱為鏈表)由各個元素之間通過一個指針彼此鏈接起來而組成。每個元素包含兩個部分:數據成員和一個稱為next的指針。通過采用這種二成員的結構,將每個元素的next指針設置為指向其後面的元素(見圖1)。最後一個元素的next指針設置為NULL,簡單的表示鏈表的尾端。鏈表開始處的元素是“頭”,鏈表未尾的元素稱為尾。
要訪問鏈表中的某個元素,從鏈表頭開始,通過next指針從一個元素到另一個元素連續地遍歷直到找到所需要的那個元素為止。以單鏈表來說,只能以一個方向進行遍歷:從頭到尾,因為每個元素並沒有維護指向其前一個元素的鏈接。
從概念上說,可以把鏈表想象成一系列連續的元素。然而,由於這些元素是動態分配的(在C語言中調用malloc),因此很重要的一點是,切記這些元素通常實際上都是分散在內存空間中的(見圖2)。元素與元素之前的鏈接關系只是為了確保所有的元素都可以訪問到。帶著這種思考,我們將會看到當維護元素之間的鏈接信息時需要特別小心。如果我們錯誤地丟失了一個鏈接,則從這個位置開始,往後的所有元素都無法訪問到了。“你的弱點有多弱,你的強度就有多強”,非常適用於描述鏈表的特點。
單鏈表接口的定義
list_init
void list_init(List *list,void (*destroy)(void *data));
返回值 無
描述 初始化由list指定的鏈表。
該函數必須在鏈表做其他操作之前調用。當調用list_destroy時,destroy參數提供了一種釋放動態分配的數據的方法。例如,如果鏈表包含采用malloc動態分配的數據,當鏈表被銷毀時,destroy應該設置為free用來釋放數據。對於包含好幾個動態分配成員的結構化數據,destroy應該設置為一個用戶自定義的析構函數,通過對每一個動態分配的成員以及對結構體自身調用free來釋放數據。如果鏈表包含不應該釋放的數據,destroy應該設置為null。
復雜度 O(1)
list_destroy
void list_destroy(List *list);
返回值 無
描述 銷毀由參數list指定的鏈表。
調用list_destroy後任何其他的操作都不允許執行,除非再次調用list_init。list_destroy將鏈表中所有的元素都移除,如果傳給list_init的參數destroy不為null,則移除鏈表中每個元素時都調用該函數一次。
復雜度 O(n),n代表鏈表中的元素個數
list_ins_next
int list_ins_next(List *list,ListElmt *element,const void *data);
返回值 如果插入元素成功則返回0,否則返回-1.
描述 在list指定的鏈表中element後面插入一個新元素。
如果element設置為NULL,則新元素插入鏈表頭部。新元素包含一個指向data的指針,因此只要該元素還在鏈表中,data所引用的內存空間就應該保持合法。管理data所引用的存儲空間是調用者的責任。
復雜度 O(1)
list_rem_next
int list_rem_next(List *list,ListElmt *element,void **data);
返回值 如果移除元素成功則返回0,否則返回-1.
描述 移除由list指定的鏈表中element後面的那個元素。
如果element被設置為NULL,則移除鏈表頭元素。調用返回後,data指向已移除元素中存儲的數據。由調用者負責管理data所引用的存儲空間。
復雜度 O(1)
list_size
int list_size(const List *list);
返回值 鏈表中元素的個數。
描述 這是一個宏,用來計算由參數list指定的鏈表中的元素的個數。
復雜度 O(1)
list_head
ListElmt *list_head(const List *list);
返回值 指向鏈表中頭元素的指針。
描述 這是一個宏,返回由參數list指定的鏈表中頭元素的指針。
復雜度 O(1)
list_tail
ListElmt *list_tail(const List *list);
返回值 指向鏈表中尾元素的指針。
描述 這是一個宏,返回由參數list指定的鏈表中尾元素的指針。
復雜度 O(1)
list_is_head
int list_is_head(const ListElmt *element);
返回值 如果element所指定的元素是鏈表頭結點則返回1,否則返回-1.
描述 這是一個宏,用來判斷由element所指定的元素是否是鏈表的鏈表頭結點。
復雜度 O(1)
list_is_tail
int list_is_tail(const ListElmt *element);
返回值 如果element所指定的元素是鏈表尾結點則返回1,否則返回-1.
描述 這是一個宏,用來判斷由element所指定的元素是否是鏈表的鏈表尾結點。
復雜度 O(1)
list_data
void *list_data(const ListElmt *element);
返回值 節點中保存的數據。
描述 這是一個宏,返回由element所指定的鏈表節點元素中保存的數據。
復雜度 O(1)
list_next
ListEmlt *list_next(const ListElmt *element);
返回值 返回由element所指定的節點的下一個節點。
描述 這是一個宏,返回鏈表中由element所指定的結點的下個節點。
復雜度 O(1)
數據結構 鏈表_單鏈表的接口定義