不知道各位讀者是怎么理解鏈表的,還有就是鏈表和結(jié)構(gòu)體的關(guān)系?最近開發(fā)的項(xiàng)目資源不是很緊湊,就用了面向?qū)ο缶帉?,就大量的使用到結(jié)構(gòu)體,有時還會配合共同體嵌套使用,順便回顧了一些結(jié)構(gòu)體的使用,這里主要簡單回顧結(jié)構(gòu)體和鏈表的關(guān)系;
鏈表在RTOS上比較常見,這里會把復(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;
};
//錯誤定義方式之一
typrder struct node
{
unsigned char data;
node_t *next;
}node_t;
代碼都是一行一行執(zhí)行的,如果沒有提前聲明調(diào)用的話,代碼編譯階段就會報錯,同樣的,類型定義比類型調(diào)用使用晚也會報錯;有些初學(xué)者會對結(jié)構(gòu)體使用同名結(jié)構(gòu)體會有疑問,其實(shí)把同名的結(jié)構(gòu)體換個思路,上面的第二行是不是定義了一個struct node類型的數(shù)據(jù),結(jié)構(gòu)體成員是不是變量類型+變量名,是不是符合結(jié)構(gòu)體的基本使用,所有這樣的用法是合法的;
| 鏈接成表
鏈表的最小單位就是節(jié)點(diǎn),那么多定義幾個節(jié)點(diǎn),然后就讓它們鏈接起來,那么就形成了鏈表,那么這條“鏈”是啥呢,有時怎么把它們關(guān)聯(lián)起來的呢?學(xué)過鏈表的同學(xué)就很清楚,就是節(jié)點(diǎn)中的同名結(jié)構(gòu)體指針,這個指針就像電話號碼,直接通過電話號碼就能找到對應(yīng)的人,同理也可以通過指針找到對應(yīng)的節(jié)點(diǎn);
申請內(nèi)存的坑,申請的內(nèi)存一定要強(qiáng)制轉(zhuǎn)換類型,不強(qiáng)制轉(zhuǎn)換默認(rèn)是返回一個任意類型的指針(void *),不強(qiáng)制轉(zhuǎn)換類型編譯也會出錯:
int main()
{
inttemp=10;
// 沒有強(qiáng)制轉(zhuǎn)換類型,編譯報錯
int *p = malloc(siezof(temp))
}
列個完整的小程序,看完基本就學(xué)會了鏈表:
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
unsigned char data;
struct node *next;
}node_t;
int main()
{
// 創(chuàng)建幾個節(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é)動動小手指點(diǎn)個贊吧,我是Noah,我們下篇推文再見!
審核編輯:郭婷
-
RTOS
+關(guān)注
關(guān)注
25文章
865瀏覽量
122749 -
代碼
+關(guān)注
關(guān)注
30文章
4956瀏覽量
73506
原文標(biāo)題:通俗|結(jié)構(gòu)體與鏈表
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
10個例子代碼,C語言結(jié)構(gòu)體的高級
一個經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用的實(shí)例
結(jié)構(gòu)體聲明與定義
無數(shù)據(jù)域雙向鏈表的代碼
typedef結(jié)構(gòu)體使用
為什么不建議用匿名結(jié)構(gòu)體
C語言結(jié)構(gòu)體使用
定義IO初始化結(jié)構(gòu)體
滲壓計在混凝土結(jié)構(gòu)體中的安裝指南
應(yīng)用開發(fā)中結(jié)構(gòu)體和鏈表的關(guān)系是怎樣的
評論