回看了一下以前寫(xiě)的鏈表操作,確實(shí)有點(diǎn)復(fù)雜不利于初學(xué),這篇文章就換個(gè)寫(xiě)法,簡(jiǎn)單明了的介紹鏈表的操作;
第一步:定義節(jié)點(diǎn)結(jié)構(gòu)體,可以把它看成一個(gè)模板:
// 定義節(jié)點(diǎn)
typedef struct node
{
unsigned char data;
struct node *next;
}node_t;
第二步:初始化節(jié)點(diǎn),目的就是獲取到頭節(jié)點(diǎn),后續(xù)的操作都是判斷節(jié)點(diǎn)的同名結(jié)構(gòu)體指針是否為空,所有頭節(jié)點(diǎn)的head->next必須等于NULL:
// 初始化節(jié)點(diǎn)
node_t* node_init(unsigned char data)
{
node_t* head=(node_t*)malloc(sizeof(node_t));
head->data = data;
head->next = NULL;
return head;
}
第三步:打印節(jié)點(diǎn)數(shù)據(jù),用于查看節(jié)點(diǎn)的最新數(shù)據(jù):
// 打印鏈表
void node_printf(node_t *node)
{
node_t *head = node;
while(1){
printf("data:%d
",head->data);
if(head->next==NULL){
return;
}else{
head = head->next;
}
};
}
第四步:尾插方式把新的節(jié)點(diǎn)接入鏈表,核心就是判斷節(jié)點(diǎn)的指針是否為空,找到最尾巴的節(jié)點(diǎn),然后把新的節(jié)點(diǎn)接到它的后面,然后再把新的節(jié)點(diǎn)指針賦值為空:
// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
node_t *head = node;
node_t *end = node;
while(1){
if(end->next!=NULL){
end = end->next;
}else{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = NULL;
end->next = temp_node;
return head;
}
}
}
第五步:通過(guò)尾刪的方式,把節(jié)點(diǎn)指針為空的節(jié)點(diǎn)刪除,再把它上一個(gè)節(jié)點(diǎn)賦值為空:
// 尾刪
node_t* node_end_del(node_t *node)
{
node_t *head = node;
node_t *end = node;
node_t *temp = NULL;
while(1){
if(end->next!=NULL){
temp = end;
end = end->next;
}else{
free(end);
temp->next = NULL;
return head;
}
}
}
第六步:通過(guò)頭插方式,把新的節(jié)點(diǎn)接入到鏈表,頭插的方式并不需要賦值為空,因?yàn)樗迦氲南乱还?jié)點(diǎn),就是上一次插入的節(jié)點(diǎn)指針,所以只需要把上一個(gè)節(jié)點(diǎn)指針賦值給新加入的指針即可,注意頭插一定要返回頭節(jié)點(diǎn)指針,因?yàn)轭^插的頭節(jié)點(diǎn)會(huì)隨著插入而改變:
// 頭插
node_t* node_head_add(node_t *node, unsigned char data)
{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = node;
return temp_node;
}
第七步:通過(guò)頭刪的方式,把頭部的節(jié)點(diǎn)刪除,因?yàn)轭^部的節(jié)點(diǎn)是已知的,所以只要改表一下頭節(jié)點(diǎn),然后把頭部節(jié)點(diǎn)釋放就可以:
// 頭刪
node_t* node_head_del(node_t *node)
{
node_t* head = node->next;
free(node);
return head;
}
總結(jié):尾節(jié)點(diǎn)操作是通過(guò)判斷節(jié)點(diǎn)指針是否為NULL,找到節(jié)點(diǎn)指針為NULL的指針,然后進(jìn)行相關(guān)操作,而頭節(jié)點(diǎn)直接就通過(guò)頭節(jié)點(diǎn)進(jìn)行相關(guān)操作,頭插和尾插最大的不同就是數(shù)據(jù)是反的,這點(diǎn)要注意不要搞錯(cuò);
完整代碼如下:
#include "stdio.h"
#include "stdlib.h"
// 定義節(jié)點(diǎn)
typedef struct node
{
unsigned char data;
struct node *next;
}node_t;
// 初始化節(jié)點(diǎn)
node_t* node_init(unsigned char data)
{
node_t* head=(node_t*)malloc(sizeof(node_t));
head->data = data;
head->next = NULL;
return head;
}
// 打印鏈表
void node_printf(node_t *node)
{
node_t *head = node;
while(1){
printf("data:%d
",head->data);
if(head->next==NULL){
return;
}else{
head = head->next;
}
};
}
// 尾插
node_t* node_end_add(node_t *node, unsigned char data)
{
node_t *head = node;
node_t *end = node;
while(1){
if(end->next!=NULL){
end = end->next;
}else{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = NULL;
end->next = temp_node;
return head;
}
}
}
// 尾刪
node_t* node_end_del(node_t *node)
{
node_t *head = node;
node_t *end = node;
node_t *temp = NULL;
while(1){
if(end->next!=NULL){
temp = end;
end = end->next;
}else{
free(end);
temp->next = NULL;
return head;
}
}
}
// 頭插
node_t* node_head_add(node_t *node, unsigned char data)
{
node_t* temp_node=(node_t*)malloc(sizeof(node_t));
temp_node->data = data;
temp_node->next = node;
return temp_node;
}
// 頭刪
node_t* node_head_del(node_t *node)
{
node_t* head = node->next;
free(node);
return head;
}
int main()
{
node_t* user_node = node_init(1);
// 尾
// user_node = node_end_add(user_node, 2);
// user_node = node_end_add(user_node, 3);
// user_node = node_end_add(user_node, 4);
// node_printf(user_node);
// printf("------
");
// user_node = node_end_del(user_node);
// user_node = node_end_del(user_node);
// node_printf(user_node);
// printf("------
");
// user_node = node_end_add(user_node, 3);
// user_node = node_end_add(user_node, 4);
// node_printf(user_node);
// printf("------
");
// 頭
user_node = node_head_add(user_node, 2);
user_node = node_head_add(user_node, 3);
user_node = node_head_add(user_node, 4);
node_printf(user_node);
printf("------
");
user_node = node_head_del(user_node);
user_node = node_head_del(user_node);
node_printf(user_node);
printf("------
");
user_node = node_head_add(user_node, 3);
user_node = node_head_add(user_node, 4);
node_printf(user_node);
printf("------
");
}
代碼寫(xiě)得不是很?chē)?yán)謹(jǐn),主要用于入門(mén)學(xué)習(xí),把主要思路講清楚;覺(jué)得有收獲的同學(xué)動(dòng)動(dòng)小手指點(diǎn)個(gè)贊吧,我是Noah,我們下篇推文再見(jiàn)!
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73960 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11371 -
鏈表
+關(guān)注
關(guān)注
0文章
80瀏覽量
11057
原文標(biāo)題:通俗|操作鏈表
文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
結(jié)構(gòu)數(shù)據(jù):鏈表刪除及靜態(tài)鏈表操作(1)#結(jié)構(gòu)數(shù)據(jù)
[2.3.2]--2.3.2單鏈表基本操作的實(shí)現(xiàn)
Linux內(nèi)核的鏈表操作
Linux鏈表操作心得體會(huì)
回調(diào)函數(shù)的相關(guān)資料推薦
數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作
淺析RT-Thread中對(duì)象容器與雙鏈表的操作
小編科普一下rtthread鏈表操作的幾個(gè)API與實(shí)用的幾個(gè)宏
單鏈表的基本操作(含源代碼)
C++結(jié)構(gòu)體與鏈表的實(shí)驗(yàn)報(bào)告資料免費(fèi)下載
單鏈表學(xué)習(xí)的超詳細(xì)說(shuō)明(二)
單鏈表學(xué)習(xí)的總結(jié)(一)
說(shuō)說(shuō)Go里面的鏈表操作
鏈表的基本操作
評(píng)論