不知道各位讀者是怎么理解鏈表的,還有就是鏈表和結(jié)構(gòu)體的關(guān)系?最近開發(fā)的項(xiàng)目資源不是很緊湊,就用了面向?qū)ο缶帉?,就大量的使用到結(jié)構(gòu)體,有時(shí)還會(huì)配合共同體嵌套使用,順便回顧了一些結(jié)構(gòu)體的使用,這里主要簡單回顧結(jié)構(gòu)體和鏈表的關(guān)系;
鏈表在RTOS上比較常見,這里會(huì)把復(fù)雜的東西簡單化,這也是為啥有些推文的文字很少的原因,碼農(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í)行的,如果沒有提前聲明調(diào)用的話,代碼編譯階段就會(huì)報(bào)錯(cuò),同樣的,類型定義比類型調(diào)用使用晚也會(huì)報(bào)錯(cuò);有些初學(xué)者會(huì)對結(jié)構(gòu)體使用同名結(jié)構(gòu)體會(huì)有疑問,其實(shí)把同名的結(jié)構(gòu)體換個(gè)思路,上面的第二行是不是定義了一個(gè)struct node類型的數(shù)據(jù),結(jié)構(gòu)體成員是不是變量類型+變量名,是不是符合結(jié)構(gòu)體的基本使用,所有這樣的用法是合法的;
| 鏈接成表
鏈表的最小單位就是節(jié)點(diǎn),那么多定義幾個(gè)節(jié)點(diǎn),然后就讓它們鏈接起來,那么就形成了鏈表,那么這條“鏈”是啥呢,有時(shí)怎么把它們關(guān)聯(lián)起來的呢?學(xué)過鏈表的同學(xué)就很清楚,就是節(jié)點(diǎn)中的同名結(jié)構(gòu)體指針,這個(gè)指針就像電話號碼,直接通過電話號碼就能找到對應(yīng)的人,同理也可以通過指針找到對應(yīng)的節(jié)點(diǎn);
申請內(nèi)存的坑,申請的內(nèi)存一定要強(qiáng)制轉(zhuǎn)換類型,不強(qiáng)制轉(zhuǎn)換默認(rèn)是返回一個(gè)任意類型的指針(void *),不強(qiáng)制轉(zhuǎn)換類型編譯也會(huì)出錯(cuò):
int main() { inttemp=10; // 沒有強(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ì)就是對節(jié)點(diǎn)中的指針操作,以及節(jié)點(diǎn)的創(chuàng)建和釋放,基本不是什么大問題;看到這應(yīng)該對鏈表基礎(chǔ)知識沒有疑問了吧,覺得有收獲的同學(xué)動(dòng)動(dòng)小手指點(diǎn)個(gè)贊吧,我是Noah,我們下篇推文再見!
審核編輯:郭婷
-
RTOS
+關(guān)注
關(guān)注
24文章
837瀏覽量
120607 -
代碼
+關(guān)注
關(guān)注
30文章
4882瀏覽量
70050
原文標(biāo)題:通俗|結(jié)構(gòu)體與鏈表
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景
中軟國際Lumi智能體開發(fā)平臺(tái)支持DeepSeek
噪聲與ADC的范圍和位數(shù)是什么關(guān)系呢?怎樣選用和匹配?
結(jié)構(gòu)體成員的順序會(huì)影響結(jié)構(gòu)體的大小嗎
請問VG與增益的線性關(guān)系是怎樣的?
AMC1302-Q1芯片輸入輸出電壓對應(yīng)關(guān)系是怎樣的?
ota升級的庫中,結(jié)構(gòu)體upgrade_server_info中pespconn的作用是什么?
ESP32-C3如何把一個(gè)const結(jié)構(gòu)體固定放在生成的bin文件的最末尾?
請問esp-idf&vscode結(jié)構(gòu)體索引不到對應(yīng)的成員如何解決?
MOSFET的基本結(jié)構(gòu)與工作原理
你是否真的了解結(jié)構(gòu)體占用了多少字節(jié)?

嵌入式中C語言結(jié)構(gòu)體基本實(shí)現(xiàn)

評論