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