單鏈表的設計之初,筆者在考慮乙個首要的問題,就是單鏈表的節點是在插入的函式內部建立,還是在函式外部建立。考慮到使用者在插入的時候,變數生命週期的不確定性以及容易造成記憶體洩漏等問題,綜合考慮之下使用了內部建立節點的方式。筆者設計的單鏈表中包含了單鏈表的反轉和合併等有趣的操作,其中的奧妙如果讀者有興趣可以細究。比如為什麼筆者使用了二級指標來合併單鏈表,而不直接使用一級指標,比如為什麼在清空鍊錶節點時,根據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...
資料結構 線性表之帶頭結點單鏈表
之前跟著朱老師寫的乙個帶頭結點的 建立鍊錶時有兩種方法,一種是先初始化 建立乙個空鍊錶 然後對這個空鍊錶進行結點輸入,建立鍊錶 這個時候,由於已經有了頭結點,將其傳入,直接在頭結點的後面進行操作 另外一種是將初始化和建立鍊錶放到乙個函式裡,這時候傳入的鍊錶就什麼都沒有,連頭結點也沒有 先建立頭結點,...