回看了一下以前寫的鏈表操作,確實有點復雜不利于初學,這篇文章就換個寫法,簡單明了的介紹鏈表的操作;
第一步:定義節點結構體,可以把它看成一個模板:
// 定義節點 typedef struct node { unsigned char data; struct node *next; }node_t;
第二步:初始化節點,目的就是獲取到頭節點,后續的操作都是判斷節點的同名結構體指針是否為空,所有頭節點的head->next必須等于NULL:
// 初始化節點 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; }
總結:尾節點操作是通過判斷節點指針是否為NULL,找到節點指針為NULL的指針,然后進行相關操作,而頭節點直接就通過頭節點進行相關操作,頭插和尾插最大的不同就是數據是反的,這點要注意不要搞錯;
完整代碼如下:
#include "stdio.h" #include "stdlib.h" // 定義節點 typedef struct node { unsigned char data; struct node *next; }node_t; // 初始化節點 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("------ "); }
代碼寫得不是很嚴謹,主要用于入門學習,把主要思路講清楚;覺得有收獲的同學動動小手指點個贊吧,我是Noah,我們下篇推文再見!
審核編輯:湯梓紅
-
代碼
+關注
關注
30文章
4826瀏覽量
69052 -
結構體
+關注
關注
1文章
130瀏覽量
10872 -
鏈表
+關注
關注
0文章
80瀏覽量
10599
原文標題:通俗|操作鏈表
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論