回看了一下以前寫的鏈表操作,確實(shí)有點(diǎn)復(fù)雜不利于初學(xué),這篇文章就換個寫法,簡單明了的介紹鏈表的操作;
第一步:定義節(jié)點(diǎn)結(jié)構(gòu)體,可以把它看成一個模板:
// 定義節(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; } } }
第五步:通過尾刪的方式,把節(jié)點(diǎn)指針為空的節(jié)點(diǎn)刪除,再把它上一個節(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; } } }
第六步:通過頭插方式,把新的節(jié)點(diǎn)接入到鏈表,頭插的方式并不需要賦值為空,因為它插入的下一節(jié)點(diǎn),就是上一次插入的節(jié)點(diǎn)指針,所以只需要把上一個節(jié)點(diǎn)指針賦值給新加入的指針即可,注意頭插一定要返回頭節(jié)點(diǎn)指針,因為頭插的頭節(jié)點(diǎn)會隨著插入而改變:
// 頭插 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é)點(diǎ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)操作是通過判斷節(jié)點(diǎn)指針是否為NULL,找到節(jié)點(diǎn)指針為NULL的指針,然后進(jìn)行相關(guān)操作,而頭節(jié)點(diǎn)直接就通過頭節(jié)點(diǎn)進(jìn)行相關(guān)操作,頭插和尾插最大的不同就是數(shù)據(jù)是反的,這點(diǎn)要注意不要搞錯;
完整代碼如下:
#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("------ "); }
代碼寫得不是很嚴(yán)謹(jǐn),主要用于入門學(xué)習(xí),把主要思路講清楚;覺得有收獲的同學(xué)動動小手指點(diǎn)個贊吧,我是Noah,我們下篇推文再見!
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4830瀏覽量
69094 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10872 -
鏈表
+關(guān)注
關(guān)注
0文章
80瀏覽量
10609
原文標(biāo)題:通俗|操作鏈表
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
![](https://file1.elecfans.com/web2/M00/86/CB/wKgZomRmbGeAUsuMAADH5RpWAPA940.png)
結(jié)構(gòu)數(shù)據(jù):鏈表刪除及靜態(tài)鏈表操作(2)#結(jié)構(gòu)數(shù)據(jù)
![](https://file1.elecfans.com/web2/M00/87/B9/wKgZomRmlcGAJd2nAAAYVU5qe8o209.png)
![](https://file1.elecfans.com/web2/M00/87/B9/wKgZomRmlcKANvjyAAAYifrOKCk221.png)
![](https://file1.elecfans.com/web2/M00/87/B8/wKgaomRmlcyAHnWsAABEICBjWhQ553.png)
[2.3.2]--2.3.2單鏈表基本操作的實(shí)現(xiàn)
Linux內(nèi)核的鏈表操作
Linux鏈表操作心得體會
回調(diào)函數(shù)的相關(guān)資料推薦
數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作
淺析RT-Thread中對象容器與雙鏈表的操作
小編科普一下rtthread鏈表操作的幾個API與實(shí)用的幾個宏
單鏈表的基本操作(含源代碼)
C++結(jié)構(gòu)體與鏈表的實(shí)驗報告資料免費(fèi)下載
![C++結(jié)構(gòu)體與<b class='flag-5'>鏈表</b>的實(shí)驗報告資料免費(fèi)下載](https://file.elecfans.com/web1/M00/93/52/o4YBAFzrVo2AH6UqAAEt3Ed8TG0393.png)
單鏈表學(xué)習(xí)的超詳細(xì)說明(二)
單鏈表學(xué)習(xí)的總結(jié)(一)
說說Go里面的鏈表操作
![說說Go里面的<b class='flag-5'>鏈表</b><b class='flag-5'>操作</b>](https://file.elecfans.com/web2/M00/61/94/poYBAGL8WoeAayNXAAClnjzwFos168.png)
評論