不知道各位讀者是怎么理解鏈表的,還有就是鏈表和結構體的關系?最近開發的項目資源不是很緊湊,就用了面向對象編寫,就大量的使用到結構體,有時還會配合共同體嵌套使用,順便回顧了一些結構體的使用,這里主要簡單回顧結構體和鏈表的關系;
鏈表在RTOS上比較常見,這里會把復雜的東西簡單化,這也是為啥有些推文的文字很少的原因,碼農的產出就是代碼,核心就是看相關代碼;鏈表分單鏈表和雙鏈表,核心都差不多的,就用單鏈表做展示;
| 定義節點
鏈表的最小單位就是節點,節點的定義就是鏈表的基礎,下面展示一些定義的小案例:
//正確定義方式之一 struct node { unsigned char data; struct node *next; }; //錯誤定義方式之一 typrder struct node { unsigned char data; node_t *next; }node_t;
代碼都是一行一行執行的,如果沒有提前聲明調用的話,代碼編譯階段就會報錯,同樣的,類型定義比類型調用使用晚也會報錯;有些初學者會對結構體使用同名結構體會有疑問,其實把同名的結構體換個思路,上面的第二行是不是定義了一個struct node類型的數據,結構體成員是不是變量類型+變量名,是不是符合結構體的基本使用,所有這樣的用法是合法的;
| 鏈接成表
鏈表的最小單位就是節點,那么多定義幾個節點,然后就讓它們鏈接起來,那么就形成了鏈表,那么這條“鏈”是啥呢,有時怎么把它們關聯起來的呢?學過鏈表的同學就很清楚,就是節點中的同名結構體指針,這個指針就像電話號碼,直接通過電話號碼就能找到對應的人,同理也可以通過指針找到對應的節點;
申請內存的坑,申請的內存一定要強制轉換類型,不強制轉換默認是返回一個任意類型的指針(void *),不強制轉換類型編譯也會出錯:
int main() { inttemp=10; // 沒有強制轉換類型,編譯報錯 int *p = malloc(siezof(temp)) }
列個完整的小程序,看完基本就學會了鏈表:
#include "stdio.h" #include "stdlib.h" typedef struct node { unsigned char data; struct node *next; }node_t; int main() { // 創建幾個節點 node_t* node1=(node_t*)malloc(sizeof(node_t)); node_t* node2=(node_t*)malloc(sizeof(node_t)); node_t* node3=(node_t*)malloc(sizeof(node_t)); // 初始數據 node1->data = 1; node2->data = 2; node3->data = 3; // 鏈接成表 node1->next = node2; node2->next = node3; node3->next = node1; // 打印數據 printf("data:%d ", node1->data); // 節點1的數據 printf("data:%d ", node1->next->data); // 節點2的數據 printf("data:%d ", node1->next->next->data); // 節點3的數據 printf("data:%d ", node1->next->next->next->data); // 節點1的數據 // 釋放內存 free(node1); free(node2); free(node3); }
鏈表的增刪改查本質就是對節點中的指針操作,以及節點的創建和釋放,基本不是什么大問題;看到這應該對鏈表基礎知識沒有疑問了吧,覺得有收獲的同學動動小手指點個贊吧,我是Noah,我們下篇推文再見!
審核編輯:郭婷
-
RTOS
+關注
關注
22文章
815瀏覽量
119695 -
代碼
+關注
關注
30文章
4791瀏覽量
68688
原文標題:通俗|結構體與鏈表
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論