鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。 相比於線性表順序結構,操作複雜。由於不必須按順序儲存,鍊錶在插入的時候可以達到o(1)的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o(n)的時間,而線性表和順序表相應的時間複雜度分別是o(logn)和o(1)。
以下是個人的理解:
將碎片化的記憶體關聯起來,形成(鏈式儲存)的線性關係。常用於高階的記憶體管理,如,c++記憶體分配器。
單鏈表**實現,以 int 整型示例
#include
#include
/*\ brief 節點宣告
*/typedef
struct node
node,
* nodeptr;
/*\ brief 鍊錶宣告
*/typedef
struct
linked,
* linkedptr;
/*\ brief 初始化鍊錶,在使用之前呼叫一次
\ param link 鍊錶容器指標
*/void
init
(linkedptr link)
/*\ brief 配置節點
\ param 節點元素
\ return 成功返回節點指標,失敗返回null
*/nodeptr allocator
(int element)
else
return node;}/*
\ brief 尾部插入節點
\ param link 鍊錶容器指標
\ param element 元素
*/void
pushback
(linkedptr link,
int element)
link->tailptr->next = node;
link->tailptr = node;
link->size++;}
/*\ brief 首節點插入
\ param link 鍊錶容器指標
\ param element 元素
*/void
pushfirst
(linkedptr link,
int element)
node->next = link->node.next;
link->node.next = node;
link->size++;}
/*\ brief 插入節點
\ param link 鍊錶容器指標
\ param pos 要插入的下標
\ param element 元素
*/void
insert
(linkedptr link, size_t pos,
int element)
node->next = tmpnode->next;
tmpnode->next = node;
link->size++;}
/*\ brief 刪除首節點
\ param link 鍊錶容器指標
*/void
popfirst
(linkedptr link)
/*\ brief 刪除鍊錶尾節點
\ param 鍊錶容器指標
*/void
popback
(linkedptr link)
nodeptr tmpnode = node->next;
node->next =
null
;free
(tmpnode)
; link->tailptr = node;
link->size--;}
/*\ brief 根據下標返回指定節點元素
\ param link 鍊錶容器指標
\ param pos 下標
\ return 返回下標的元素
*/int
findlinkelement
(linkedptr link, size_t pos)
return node->element;}/*
\ brief 根據元素返回鍊錶下標
\ param link 鍊錶容器指標
\ param element 要查詢的元素
\ return 成功返回下標,失敗返回-1
*/int
findlinkpos
(linkedptr link,
int element)
node = node->next;
}return-1
;}/*\ brief 刪除下標元素節點
\ param link 鍊錶容器指標
\ param pos 下標
*/void
poplinkpos
(linkedptr link, size_t pos)if(
!pos)
nodeptr node = link->node.next;
for(size_t i =
1; i < pos; i++
) nodeptr tmpnode = node->next;
node->next = tmpnode->next;
free
(tmpnode)
; link->size--;}
/*\ brief 清空鍊錶,銷毀前呼叫一次
\ param 鍊錶容器指標
*/void
clear
(linkedptr link)
link->size =0;
link->tailptr =
&link->node;}/*
\ brief 列印鍊錶
\ param link 鍊錶容器指標
*/void
printlink
(linkedptr link)
}int
main
(int argc,
char
* ar**)
文章時間2023年12月3日18:27:26 c語言之單鏈表簡單操作
建立鍊錶有倆種方式,一種是頭插法,一種是尾插法,倆種方法大同小異,在此我介紹尾插法。用圖示的方法很好理解。下面是用尾插法建立鍊錶的 struct student int n 記錄存放資料數目 struct student create p2 next null return head 建立過程結束 ...
資料結構C語言之單鏈表簡單實現
include stdafx.h include include 定義單鏈表 typedef struct lnodelnode,linklist int tmain int argc,tchar argv void createlinklist linklist l,int n 使頭結點還原到原始...
C語言之實現單鏈表的基本操作
目錄 1 鍊錶節點的定義 2 鍊錶基操function的宣告 3 鍊錶基操function的定義與實現 3.1 單鏈表的建立 頭插法 3.2 單鏈表的建立 尾插法 3.3 有序單鏈表的建立 3.4 單鏈表的遍歷 3.5 在單鏈表中查詢元素 3.6 在單鏈表中的指定位置後插入元素 3.7 在單鏈表中刪...