無頭單鏈表的增刪查改

2021-09-29 10:25:26 字數 3649 閱讀 4664

我們之前接觸過順序表(如果沒有了解的童鞋可以看看我的另一篇blog)

資料結構:順序表

順序表的優點與缺點:

我們知道順序表儲存資料可以很容易的對資料進行訪問(即隨機下標訪問)時間複雜度o(1),但是它也有自己的缺陷:比如在頻繁增刪的場景下時間複雜度很不友好o(n),擴容時會導致空間的浪費等一系列問題。

面對這些問題,還有一種儲存結構被稱作鍊錶

今天我們就來引入了鍊錶的概念:

鍊錶是邏輯上有連續關係,但是物理上並不連續的鏈式儲存結構。

資料的邏輯順序是通過鍊錶中指標的連續次序實現的,可以通過結構體指標實現動態的儲存和分配。

鍊錶的優點與缺點:

插入和刪除的效率高,只需要改變指標的指向即可完成插入和刪除,時間複雜度o(1)。記憶體利用率高,可以使用記憶體中細小的不連續的空間,只有在需要時建立空間,大小不固定,拓展靈活。但是鍊錶的查詢效率比較低,因為鍊錶是從第乙個結點向後遍歷查詢,時間複雜度o(n)。

鍊錶的結點:

鍊錶中的每個結點都分為兩個域,乙個資料域和乙個指標域,如同鐵鍊一樣,將資料連線在一起,第乙個元素指向第二個,第二個指向……一直到null鍊錶結束。

鍊錶的結點結構體:

typedef

struct nodenode;

和順序表一樣,我們也會對鍊錶進行一些列的增刪查改等操作,接下來我們一起看看吧。鍊錶的初始化

main.c

node *first;

linklistinit

(&first)

;

linklist.c

實則就是初始化一條空鍊錶(乙個結點都沒有的鍊錶)

*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...