不知道各位讀者是怎么理解鏈表的,還有就是鏈表和結(jié)構(gòu)體的關(guān)系?最近開發(fā)的項(xiàng)目資源不是很緊湊,就用了面向?qū)ο缶帉懀痛罅康氖褂玫浇Y(jié)構(gòu)體,有時(shí)還會(huì)配合共同體嵌套使用,順便回顧了一些結(jié)構(gòu)體的使用,這里主要簡(jiǎn)單回顧結(jié)構(gòu)體和鏈表的關(guān)系;
鏈表在RTOS上比較常見(jiàn),這里會(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,我們下篇推文再見(jiàn)!
審核編輯:郭婷
-
RTOS
+關(guān)注
關(guān)注
22文章
819瀏覽量
119889 -
代碼
+關(guān)注
關(guān)注
30文章
4828瀏覽量
69055
原文標(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)先 登錄
相關(guān)推薦
結(jié)構(gòu)體成員的順序會(huì)影響結(jié)構(gòu)體的大小嗎
C語(yǔ)言和C++中結(jié)構(gòu)體的區(qū)別
請(qǐng)問(wèn)VG與增益的線性關(guān)系是怎樣的?
AMC1302-Q1芯片輸入輸出電壓對(duì)應(yīng)關(guān)系是怎樣的?
ota升級(jí)的庫(kù)中,結(jié)構(gòu)體upgrade_server_info中pespconn的作用是什么?
ESP32-C3如何把一個(gè)const結(jié)構(gòu)體固定放在生成的bin文件的最末尾?
請(qǐng)問(wèn)esp-idf&vscode結(jié)構(gòu)體索引不到對(duì)應(yīng)的成員如何解決?
MOSFET的基本結(jié)構(gòu)與工作原理
你是否真的了解結(jié)構(gòu)體占用了多少字節(jié)?
![你是否真的了解<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>占用了多少字節(jié)?](https://file.elecfans.com/web2/M00/9B/3D/poYBAGQjnauAVXOgAABFcEbXdEE684.png)
嵌入式中C語(yǔ)言結(jié)構(gòu)體基本實(shí)現(xiàn)
![嵌入式<b class='flag-5'>中</b>C語(yǔ)言<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>基本實(shí)現(xiàn)](https://file1.elecfans.com//web2/M00/E4/42/wKgZomY_FOKAdlRXAADOabNodfI522.jpg)
評(píng)論