我們之前接觸過順序表(如果沒有了解的童鞋可以看看我的另一篇blog)
資料結構:順序表
順序表的優點與缺點:
我們知道順序表儲存資料可以很容易的對資料進行訪問(即隨機下標訪問)時間複雜度o(1),但是它也有自己的缺陷:比如在頻繁增刪的場景下時間複雜度很不友好o(n),擴容時會導致空間的浪費等一系列問題。
面對這些問題,還有一種儲存結構被稱作鍊錶。
今天我們就來引入了鍊錶的概念:
鍊錶是邏輯上有連續關係,但是物理上並不連續的鏈式儲存結構。
資料的邏輯順序是通過鍊錶中指標的連續次序實現的,可以通過結構體指標實現動態的儲存和分配。
鍊錶的優點與缺點:
插入和刪除的效率高,只需要改變指標的指向即可完成插入和刪除,時間複雜度o(1)。記憶體利用率高,可以使用記憶體中細小的不連續的空間,只有在需要時建立空間,大小不固定,拓展靈活。但是鍊錶的查詢效率比較低,因為鍊錶是從第乙個結點向後遍歷查詢,時間複雜度o(n)。
鍊錶的結點:
鍊錶中的每個結點都分為兩個域,乙個資料域和乙個指標域,如同鐵鍊一樣,將資料連線在一起,第乙個元素指向第二個,第二個指向……一直到null鍊錶結束。
鍊錶的結點結構體:
typedef
struct nodenode;
和順序表一樣,我們也會對鍊錶進行一些列的增刪查改等操作,接下來我們一起看看吧。
鍊錶的初始化
main.c
linklist.cnode *first;
linklistinit
(&first)
;
實則就是初始化一條空鍊錶(乙個結點都沒有的鍊錶)
*first的位址&(*first),一級指標的位址用二級指標來接收。node **ppfirst
鍊錶的頭插void
linklistinit
(node *
*ppfirst)
被插入的資料,首先應當申請自己的空間 malloc。
再將資料域和指標域給向這塊空間。
指標域是原本 *ppfirst的指向。
頭插結束改變 *ppfirst指向新加入元素的結點位址。
鍊錶的頭刪void
linklistpushfront
(node *
*ppfirst,
int v)
釋放頭空間前應當首先儲存第乙個結點的next(指標域)。
釋放頭空間 free(*ppfirst)
改變*ppfirst的指向新的首結點位址。
鍊錶的尾插void
linklistpopfront
(node *
*ppfirst)
首先尋找最後乙個結點的位置,才能尾插。(從第乙個結點向後遍歷,直到指標域為null,說明到達最後乙個結點)
和頭插一樣,新的資料要申請自己的空間才能加入鍊錶。
給這塊空間賦予value和指標域,因為是尾插,所以指標域為null。
這時,還應該改變插入前最後乙個結點的指標域為新空間的位址。
鍊錶的尾刪void
linklistpushback
(node *
*ppfirst,
int v)
//尋找最後乙個結點(至少乙個結點)
node *cur =
*ppfirst;
while
(cur->next !=
null
)//cur就是最後乙個結點
node *node =
(node*
)malloc
(sizeof
(node));
node->value = v;
node->next =
null
;//原來最後乙個結點的next = 新的結點
cur->next = node;
}
尾刪得找到倒數第二個結點,改變其指標域為null。
釋放最後乙個結點的空間。
鍊錶的查詢void
linklistpopback
(node *
*ppfirst)
//找到倒數第二個結點(至少兩個結點)
node *cur =
*ppfirst;
while
(cur->next->next !=
null
)//釋放最後乙個結點
free
(cur->next)
; cur->next =
null
;}
鍊錶的查詢為遍歷查詢
鍊錶的釋放node *
linklistfind
(const node *first,
int v)
}return
null
;}
鍊錶中刪除第乙個遇到的目標結點void
linklistdestroy
(node *first)
}
用cur->next的value和v比較
刪除目標結點前,先記錄cur->next的值,賦給next,刪除目標結點後,cur->next = next->next。
void
linklistremove
(node *
*ppfirst,
int v)
node *cur =
*ppfirst;
if(cur->value == v)
while
(cur->next !=
null
) cur = cur->next;
}}
單鏈表的增刪查改
include includetypedef struct nodenode,linklist int num 查詢給定值的結點,返回結點指標 node findvalue char c,node head return head 查詢給定位置的結點的值 char findindex value n...
單鏈表的增刪查改
本篇部落格主要介紹c資料結構中的單鏈表有關的增刪查改操作,並且介紹列表的快慢指標,鍊錶的逆置和合併等用法,廢話不說直接上 pragma once include include include typedef int datetype typedef struct plistnode plistno...
單鏈表的增刪查改
鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 資料域和指標域 特點 1 可以方便的進行擴充。2 可以方便的刪除和插入。例子如下 include i...