不知道各位讀者是怎么理解鏈表的,還有就是鏈表和結(jié)構(gòu)體的關(guān)系?最近開發(fā)的項(xiàng)目資源不是很緊湊,就用了面向?qū)ο缶帉?,就大量的使用到結(jié)構(gòu)體,有時(shí)還會(huì)配合共同體嵌套使用,順便回顧了一些結(jié)構(gòu)體的使用,這里主要簡(jiǎn)單回顧結(jié)構(gòu)體和鏈表的關(guān)系;
鏈表在RTOS上比較常見,這里會(huì)把復(fù)雜的東西簡(jiǎn)單化,這也是為啥有些推文的文字很少的原因,碼農(nóng)的產(chǎn)出就是代碼,核心就是看相關(guān)代碼;鏈表分單鏈表和雙鏈表,核心都差不多的,就用單鏈表做展示;
| 定義節(jié)點(diǎn)
鏈表的最小單位就是節(jié)點(diǎn),節(jié)點(diǎn)的定義就是鏈表的基礎(chǔ),下面展示一些定義的小案例:
//正確定義方式之一 struct node { unsigned char data; struct node *next; }; //錯(cuò)誤定義方式之一 typrder struct node { unsigned char data; node_t *next; }node_t;
代碼都是一行一行執(zhí)行的,如果沒(méi)有提前聲明調(diào)用的話,代碼編譯階段就會(huì)報(bào)錯(cuò),同樣的,類型定義比類型調(diào)用使用晚也會(huì)報(bào)錯(cuò);有些初學(xué)者會(huì)對(duì)結(jié)構(gòu)體使用同名結(jié)構(gòu)體會(huì)有疑問(wèn),其實(shí)把同名的結(jié)構(gòu)體換個(gè)思路,上面的第二行是不是定義了一個(gè)struct node類型的數(shù)據(jù),結(jié)構(gòu)體成員是不是變量類型+變量名,是不是符合結(jié)構(gòu)體的基本使用,所有這樣的用法是合法的;
| 鏈接成表
鏈表的最小單位就是節(jié)點(diǎn),那么多定義幾個(gè)節(jié)點(diǎn),然后就讓它們鏈接起來(lái),那么就形成了鏈表,那么這條“鏈”是啥呢,有時(shí)怎么把它們關(guān)聯(lián)起來(lái)的呢?學(xué)過(guò)鏈表的同學(xué)就很清楚,就是節(jié)點(diǎn)中的同名結(jié)構(gòu)體指針,這個(gè)指針就像電話號(hào)碼,直接通過(guò)電話號(hào)碼就能找到對(duì)應(yīng)的人,同理也可以通過(guò)指針找到對(duì)應(yīng)的節(jié)點(diǎn);
申請(qǐng)內(nèi)存的坑,申請(qǐng)的內(nèi)存一定要強(qiáng)制轉(zhuǎn)換類型,不強(qiáng)制轉(zhuǎn)換默認(rèn)是返回一個(gè)任意類型的指針(void *),不強(qiáng)制轉(zhuǎn)換類型編譯也會(huì)出錯(cuò):
int main() { inttemp=10; // 沒(méi)有強(qiáng)制轉(zhuǎn)換類型,編譯報(bào)錯(cuò) int *p = malloc(siezof(temp)) }
列個(gè)完整的小程序,看完基本就學(xué)會(huì)了鏈表:
#include "stdio.h" #include "stdlib.h" typedef struct node { unsigned char data; struct node *next; }node_t; int main() { // 創(chuàng)建幾個(gè)節(jié)點(diǎn) 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)); // 初始數(shù)據(jù) node1->data = 1; node2->data = 2; node3->data = 3; // 鏈接成表 node1->next = node2; node2->next = node3; node3->next = node1; // 打印數(shù)據(jù) printf("data:%d ", node1->data); // 節(jié)點(diǎn)1的數(shù)據(jù) printf("data:%d ", node1->next->data); // 節(jié)點(diǎn)2的數(shù)據(jù) printf("data:%d ", node1->next->next->data); // 節(jié)點(diǎn)3的數(shù)據(jù) printf("data:%d ", node1->next->next->next->data); // 節(jié)點(diǎn)1的數(shù)據(jù) // 釋放內(nèi)存 free(node1); free(node2); free(node3); }
鏈表的增刪改查本質(zhì)就是對(duì)節(jié)點(diǎn)中的指針操作,以及節(jié)點(diǎn)的創(chuàng)建和釋放,基本不是什么大問(wèn)題;看到這應(yīng)該對(duì)鏈表基礎(chǔ)知識(shí)沒(méi)有疑問(wèn)了吧,覺(jué)得有收獲的同學(xué)動(dòng)動(dòng)小手指點(diǎn)個(gè)贊吧,我是Noah,我們下篇推文再見!
審核編輯:郭婷
-
RTOS
+關(guān)注
關(guān)注
24文章
856瀏覽量
122203 -
代碼
+關(guān)注
關(guān)注
30文章
4922瀏覽量
72243
原文標(biāo)題:通俗|結(jié)構(gòu)體與鏈表
文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)EDSADC的采樣值和實(shí)際輸入電壓值的換算關(guān)系是怎樣的?
定義IO初始化結(jié)構(gòu)體
滲壓計(jì)在混凝土結(jié)構(gòu)體中的安裝指南

GLAD應(yīng)用:體全息光柵模擬
程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)
C語(yǔ)言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景
中軟國(guó)際Lumi智能體開發(fā)平臺(tái)支持DeepSeek
機(jī)智云發(fā)布Gokit5 AI智能體開發(fā)板:工業(yè)級(jí)智能體流水線重構(gòu)AIoT開發(fā)范式

評(píng)論