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

鏈表的基本操作
評論