C資料結構 線性表之單鏈表

2021-08-08 21:28:37 字數 4371 閱讀 7891

單鏈表的設計之初,筆者在考慮乙個首要的問題,就是單鏈表的節點是在插入的函式內部建立,還是在函式外部建立。考慮到使用者在插入的時候,變數生命週期的不確定性以及容易造成記憶體洩漏等問題,綜合考慮之下使用了內部建立節點的方式。筆者設計的單鏈表中包含了單鏈表的反轉和合併等有趣的操作,其中的奧妙如果讀者有興趣可以細究。比如為什麼筆者使用了二級指標來合併單鏈表,而不直接使用一級指標,比如為什麼在清空鍊錶節點時,根據length清空會有可能會發生記憶體洩漏....等等。下面是**:

#ifndef linkedlist_h

#define linkedlist_h

#ifndef null

#define null 0

#endif

/* 元素型別 */

typedef int elem_t;

/* 節點結構體 */

typedef struct _tag_linked_list_node

ll_node;

/* 鍊錶結構體 */

typedef struct _tag_linked_list

linked_list;

/** * 建立鍊錶

* @return 返回鍊錶指標,null表示建立失敗

*/linked_list *linked_list_create();

/** * 從頭部插入元素

* @param plist 鍊錶指標

* @param pe 被插入元素的指標

* @return 1:成功 0:失敗

*/int linked_list_insert(linked_list *plist,elem_t *pe);

/** * 從尾部插入元素

* @param plist 鍊錶指標

* @param pe 被插入元素的指標

* @return 1:成功 0:失敗

*//**

* 查詢元素

* @param plist 鍊錶指標

* @param i 元素位置索引

* @param pe 用於儲存被查詢元素的值的指標

* @return 1:成功 0:失敗

*/int linked_list_get(linked_list *plist,int i,elem_t *pe);

/** * 按索引刪除元素

* @param plist 鍊錶指標

* @param i 被刪除元素的索引

* @param pe 用於儲存被刪除元素的值的指標

* @return 1:成功 0:失敗

*/int linked_list_remove(linked_list *plist,int i,elem_t *pe);

/** * 鍊錶反轉

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_reverse(linked_list *plist);

/** * 鍊錶合併,將第二個鍊錶鏈結到第乙個鍊錶,第二個鍊錶指標置空

* @param dest 合併的目標鍊錶

* @param pp_src 被合併的鍊錶的指標的指標

* @return 返回合併後的鍊錶的指標(第乙個引數)

*/linked_list *linked_list_merge(linked_list *dest,linked_list **pp_src);

/** * 清空鍊錶

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_clear(linked_list *plist);

/** * 銷毀鍊錶

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_destroy(linked_list *plist);

#endif // linkedlist_h

#include "linkedlist.h"

#include /**

* 建立鍊錶

* @return 返回鍊錶指標,null表示建立失敗

*/linked_list *linked_list_create()

return plist;

}/**

* 從頭部插入元素

* @param plist 鍊錶指標

* @param pe 被插入元素的指標

* @return 1:成功 0:失敗

*/int linked_list_insert(linked_list *plist,elem_t *pe)

else

}return ret;

}/**

* 從尾部插入元素

* @param plist 鍊錶指標

* @param pe 被插入元素的指標

* @return 1:成功 0:失敗

*/ node->next = null;

node->data = *pe;

current->next = node;

plist->length++;

}else

}return ret;

}/**

* 查詢元素

* @param plist 鍊錶指標

* @param i 元素位置索引

* @param pe 用於儲存被查詢元素的值的指標

* @return 1:成功 0:失敗

*/int linked_list_get(linked_list *plist,int i,elem_t *pe)

*pe = current->data;

}return ret;

}/**

* 按索引刪除元素

* @param plist 鍊錶指標

* @param i 被刪除元素的索引

* @param pe 用於儲存被刪除元素的值的指標

* @return 1:成功 0:失敗

*/int linked_list_remove(linked_list *plist,int i,elem_t *pe)

/* 儲存要被刪除的元素的值 */

*pe = pre->next->data;

pre->next = pre->next->next;

plist->length--;

}return ret;

}/**

* 鍊錶反轉

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_reverse(linked_list *plist)

/* 將頭元素的位置調整到原尾元素的後部插入 */

while(plist->head.next != tail)}}

return ret;

}/**

* 鍊錶合併,將第二個鍊錶鏈結到第乙個鍊錶,第二個鍊錶指標置空

* @param dest 合併的目標鍊錶

* @param pp_src 被合併的鍊錶的指標的指標

* @return 返回合併後的鍊錶的指標(第乙個引數)

*/linked_list *linked_list_merge(linked_list *dest,linked_list **pp_src)

current->next = (*pp_src)->head.next;

dest->length += (*pp_src)->length;

free(*pp_src);

*pp_src = null;

}return dest;

}/**

* 清空鍊錶

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_clear(linked_list *plist)

*/ll_node *head = &(plist->head);

while(head->next != null)

plist->length = 0;

}return ret;

}/**

* 銷毀鍊錶

* @param plist 鍊錶指標

* @return 1:成功 0:失敗

*/int linked_list_destroy(linked_list *plist)

return ret;

}

資料結構 線性表之單鏈表

線性表 亦作順序表 是最基本 最簡單 也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的。線性表有兩種儲存結構 順序儲存結構,即儲存單元在一段連續的位址上儲存,常見的陣列就是順序儲存結構的線性表 鏈式儲存結構,即儲存單元...

資料結構專題 線性表之單鏈表

對比了好幾本書,比較少涉及單鏈表的賦值,為了親自跑出其他功能,花了不少時間,畢竟是打基礎嘛,相信以後會越來熟練 你為什麼那麼熟練,明明是我先 話不多說,下面是 及實驗結果。include include define elementtype int define maxsize 1000 defin...

資料結構 線性表之帶頭結點單鏈表

之前跟著朱老師寫的乙個帶頭結點的 建立鍊錶時有兩種方法,一種是先初始化 建立乙個空鍊錶 然後對這個空鍊錶進行結點輸入,建立鍊錶 這個時候,由於已經有了頭結點,將其傳入,直接在頭結點的後面進行操作 另外一種是將初始化和建立鍊錶放到乙個函式裡,這時候傳入的鍊錶就什麼都沒有,連頭結點也沒有 先建立頭結點,...