回看了一下以前寫的鏈表操作,確實有點復(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的指針,然后進(jìn)行相關(guān)操作,而頭節(jié)點直接就通過頭節(jié)點進(jìn)行相關(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文章
4801瀏覽量
68735 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10855 -
鏈表
+關(guān)注
關(guān)注
0文章
80瀏覽量
10572
原文標(biāo)題:通俗|操作鏈表
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論