從頭擼乙個單鏈表

2022-06-13 10:24:13 字數 3936 閱讀 8351

@醉裡挑燈看劍,夢回吹角連營

最近在學習單鏈表時,對於單鏈表的頭節點指標的建立,以及如何給乙個鍊錶存入資料,這塊理解不是很到位。雖然明白鍊錶的基本操作,建立、插入、刪除、索引,但用c實現還是遇到一些問題難以理解,故寫一些**進行分析,終於弄清楚其實現過程,在此作一小結。

插入新的節點

刪除節點分析

**實現

分析單鏈表中,節點的建立、插入、刪除等過程

//本文鍊錶儲存int型資料為例

typedef

struct signal_node node;

通過malloc函式在堆中開闢節點空間,用來存放資料及指向下乙個節點空間的結構體指標變數,結構如下:

頭節點的建立

建立頭節點,必須先定義乙個指向頭節點的結構體指標變數node *hp = null,便於之後對鍊錶進行操作

從煉表頭插入節點

先生成新的節點空間 node *newnd,作為要插入的新節點元素

從鍊錶尾部插入

與從頭節點插入一樣,只是指向下乙個節點的指標為空

1、遍歷鍊錶,直到 p -> next = null   // p為最後乙個節點指標

2、p -> next = newnd;

3、newnd -> next = null;        //已插入節點

從指定位置插入

1、遍歷鍊錶,找到要插入的鍊錶位置p,if(p -> data == index) return p;

2、newnd -> next = p -> next -> next;

3、p -> next = newnd;

刪除節點的過程,即與插入節點的過程相反。需要注意的是,刪除某個節點,必須知道上乙個節點的指標,即上乙個節點中存放將要刪除節點中的指標。每刪除乙個節點,需要將該節點空間賦空null,並且釋放該空間free()

找到刪除節點的上乙個節點指標 *p

1、int temp_data = p -> next -> data ,臨時存放被刪除節點中的資料

2、遍歷鍊錶直到 temp_data == index,對比索引資料,找到上乙個節點指標 p

3、返回 p

刪除節點 p -> next

1、node *temp = p -> next // 將需要刪除的節點指標暫存,供之後釋放該空間所用

2、p -> next = p -> next -> next   // 刪除該節點 p -> next

3、temp = null && free(temp) // 將該節點空間賦空,並且釋放該空間

本**使用基本資料型別int,從main函式開始,一步步實現鍊錶的建立,鍊錶中節點的插入,以及向節點中輸入資料,最後乙個個刪除釋放節點空間在等操作,方便加深對鍊錶建立及操作的理解。完整**如下:

/**

* @file signal_node_base.c

* @author mahuiming, [email protected]

* @date 2019-04-01

*/#include

#include

#include

#define link_node_num 5

typedef

struct signalnode node;

/* 建立節點 */

node *

sig_createnode

(int data,

int datasize)

/* 插入乙個新的節點 */

void

insertnode

(node *p, node *newnd)

/* 將節點從鍊錶頭部插入 */

void

headinsertnode

(node *hp, node *newnd)

/* 將節點從鍊錶尾部插入 */

void

tailinsertnode

(node *hp, node *newnd)

p = p -> next;}}

/* 建立乙個鍊錶 */

void

createlist

(node *

*hpp)

/* 向鍊錶中存值,建立鍊錶 */

void

setlist

(node *hp,

int data)

/* 列印鍊錶中的資料 */

void

showlist

(node *hp)}}

/* 找到被刪除節點的上乙個節點 */

node *

find_delnode_prev

(node *hp,

int index)

p = p -> next;

}return p;

}/* 刪除節點 */

void

delete_node

(node *del_node)

intmain()

/* 顯示所有鍊錶資訊 */

showlist

(hp)

;printf

("顯示所有鍊錶資料結束!\n");

printf

("\n");

printf

("開始刪除鍊錶中的節點~\n");

for(i =

0; i < link_node_num; i++

)/* 釋放頭節點指標 */

free

(hp)

;return0;

}

程式執行過程:

成功建立節點 0

insert data:

100成功建立節點 1

insert data:

200成功建立節點 2

insert data:

300成功建立節點 3

insert data:

400成功建立節點 4

insert data:

500成功建立節點 5

鍊錶中的資料為:100

鍊錶中的資料為:200

鍊錶中的資料為:300

鍊錶中的資料為:400

鍊錶中的資料為:500

顯示所有鍊錶資料結束!

開始刪除鍊錶中的節點~

輸入要刪除節點中的資料:300

將要刪除資料為 300 的節點…

鍊錶中的資料為:100

鍊錶中的資料為:200

鍊錶中的資料為:400

鍊錶中的資料為:500

輸入要刪除節點中的資料:200

將要刪除資料為 200 的節點…

鍊錶中的資料為:100

鍊錶中的資料為:400

鍊錶中的資料為:500

輸入要刪除節點中的資料:100

將要刪除資料為 100 的節點…

鍊錶中的資料為:400

鍊錶中的資料為:500

輸入要刪除節點中的資料:500

將要刪除資料為 500 的節點…

鍊錶中的資料為:400

輸入要刪除節點中的資料:400

將要刪除資料為 400 的節點…

鍊錶為空

通過**實現及畫圖分析,會對單鏈表的一些操作更容易理解一些

反轉乙個單鏈表

思路二 反轉乙個鍊錶 示例 結構體定義 先對原鍊錶做頭刪操作,再對新鍊錶做頭插定義乙個新head頭指標,標記為newhead,將它初始為null,並非指向null,最後我們選擇返回這個newhead指標作為新鍊錶的頭指標。定義乙個結點node作為 臨時中轉站 初始化與否並無大影響。進行迴圈遍歷鍊錶各...

定義乙個單鏈表

鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 鍊錶是由乙個乙個的節點相連線的,每乙個節點都是乙個物件,都有兩個屬性 data,next 根據鍊錶的結構可以分為 1.帶頭 不帶頭 2.單向 雙向 3.迴圈 非迴圈 這些組合起來就有8種結構 編寫乙...

反轉乙個單鏈表

反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?解題心路 迭代好說,遞迴 第一思路將後面的全部翻轉好,再將最後乙個元素的next指向當前。返回最後乙個元素的指標,那就有 當前節點指標 head ...