@醉裡挑燈看劍,夢回吹角連營
最近在學習單鏈表時,對於單鏈表的頭節點指標的建立,以及如何給乙個鍊錶存入資料,這塊理解不是很到位。雖然明白鍊錶的基本操作,建立、插入、刪除、索引,但用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 ...