您好,登錄后才能下訂單哦!
這篇文章主要介紹C語言中如何使用鏈表,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
比如說學生的信息,包含了學生名稱、學號、性別、年齡等信息,這些參數(shù)可能有些是數(shù)組型、字符型、整型、甚至是結(jié)構(gòu)體類型的數(shù)據(jù)。雖然這些都是不同類型的數(shù)據(jù),但是這些都是用來表達學生信息的數(shù)據(jù)。
1、struct 結(jié)構(gòu)體名稱 訪問方法: 結(jié)構(gòu)體變量名.成員
{undefined 成員1; 成員2; };
2、 typedef struct
{undefined 成員1; 成員2; }結(jié)構(gòu)體名稱;
在中大型產(chǎn)品中一般用第2種,因為結(jié)構(gòu)體多了以后通過別名的方式定義結(jié)構(gòu)體變量能夠大大提高代碼可讀性。
1、直接用struct聲明一個結(jié)構(gòu)體,然后在定義結(jié)構(gòu)體數(shù)組,struct 結(jié)構(gòu)體名稱 數(shù)組名[數(shù)組大小]
2、用typedef struct
聲明一個結(jié)構(gòu)體,并且為結(jié)構(gòu)體重命名,通過重命名的方法定義結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體重命名 數(shù)組名[數(shù)組大小]
只要是存儲在內(nèi)存中的變量或者數(shù)組或函數(shù)編譯器都會為他們分配一個地址,我們可以通過指針變量指向這個地址來訪問地址里面的數(shù),只要把指針變量定義成同數(shù)據(jù)類型就可以指向了,比如說要指向字符型變量就定義字符型指針變量,所以我們也可以定義結(jié)構(gòu)體類型指針來指向它。
1、直接用struct
聲明一個結(jié)構(gòu)體,然后在定義結(jié)構(gòu)體指針,struct 結(jié)構(gòu)體名稱 *結(jié)構(gòu)體指針變量名
2、用typedef struct
聲明一個結(jié)構(gòu)體,并且為結(jié)構(gòu)體重命名,通過別名的方式定義結(jié)構(gòu)體指針。結(jié)構(gòu)體別名 *結(jié)構(gòu)體指針變量名
結(jié)構(gòu)體指針訪問成員方法 結(jié)構(gòu)體指針變量名->成員名
學生信息包含姓名,學號,性別,出入日期等數(shù)據(jù),而出生日期又包含年月日這3個成員,所以把出生日期單獨聲明一個結(jié)構(gòu)體,那么學生這個結(jié)構(gòu)體就包含出生日期這個結(jié)構(gòu)體,這種就是包含結(jié)構(gòu)體的結(jié)構(gòu)體。
在數(shù)據(jù)結(jié)構(gòu)里面,有一種數(shù)據(jù)結(jié)構(gòu)叫做鏈表,鏈表通俗的說就是把多個結(jié)構(gòu)體變量像鐵鏈一樣環(huán)環(huán)相扣連接起來,我們拿4個學生數(shù)據(jù)組成的鏈表來舉例,分析鏈表具體的工作原理。
#include<stdio.h> /*只要具備多種屬性就可以用結(jié)構(gòu)體來構(gòu)造;比如串口具有多種信息,時鐘源,波特率,停止位,校驗位*/ typedef struct{ unsigned short Year; unsigned char Mon; unsigned char Day; }today;/*這個結(jié)構(gòu)體只是構(gòu)造一下,本程序沒有用到*/ struct student{ unsigned char Name[20]; unsigned char number; unsigned char sex; student *pLast; /*雙向鏈表*/ student *pNext; }; int main() { unsigned char i; struct student *pStu; struct student stu1[4] = { {"stu1",1,'m',0,0}, {"stu2",2,'m',0,0}, {"stu3",3,'m',0,0}, {"stu4",4,'m',0,0}, }; stu1[0].pNext = &stu1[1]; stu1[1].pNext = &stu1[2]; stu1[2].pNext = &stu1[3]; stu1[3].pLast = &stu1[2]; stu1[2].pLast = &stu1[1]; stu1[1].pLast = &stu1[0]; pStu = &stu1[0]; for(i=0;i<4;i++) { printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex); pStu = pStu->pNext; } pStu = &stu1[3]; printf("\r\n"); for(i=0;i<4;i++) { printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex); pStu = pStu->pLast; } return 0; }
鏈表是基于結(jié)構(gòu)體的一種線性的數(shù)據(jù)結(jié)構(gòu)。
結(jié)構(gòu)體的應(yīng)用非常廣泛,這里我們記住一個黃金法則:只要是具備多種屬性的任何東西,都可以用結(jié)構(gòu)體來構(gòu)造,我們把這個東西叫做對象。比如說單片機的串口是不是有時鐘源、波特率、停止位、校驗位這些屬性?那么串口就是一個對象,可以用結(jié)構(gòu)體來構(gòu)造。
上面的鏈表是4個學生信息的結(jié)構(gòu)體變量連接在一起,這種是靜態(tài)的鏈表,意思就是連接在一起的結(jié)構(gòu)體變量數(shù)量是固定的,靜態(tài)創(chuàng)建鏈表的方法適用于一些固定好數(shù)量的數(shù)據(jù)結(jié)構(gòu)。比如產(chǎn)品需要在LCD上面顯示多級菜單架構(gòu),一般使用按鍵或者觸摸去進入子菜單或者返回主菜單,那么就可以把這些主菜單和子菜單做成一個鏈表,那么配合結(jié)構(gòu)體指針就可以很輕松的找到需要跳轉(zhuǎn)的菜單了,像這種菜單結(jié)構(gòu)往往在功能定義的時候就要規(guī)劃清楚一共需要多少個菜單,每一個菜單有那些共同的屬性。
動態(tài)鏈表的意思就是通過動態(tài)分配的方式把結(jié)構(gòu)體變量連接起來,這種結(jié)構(gòu)體變量的數(shù)量是未知的,會隨著某種條件增加或減少結(jié)構(gòu)體變量的數(shù)量。比如說我要接收串口的數(shù)據(jù),如果串口一次性接收10個數(shù)據(jù)那么很好處理,我們直接定義一個數(shù)組,把大小設(shè)置成10就可以了。那如果我們不知道到底串口會來多少個數(shù)據(jù)的情況下,比如說有可能這一幀來100個,下一幀來1000個,那用數(shù)組來存儲是不是就很不方便,不知道到底該分配多大的數(shù)組,如果分配大小為1000的數(shù)組就會造成內(nèi)存浪費,像我們就可以使用動態(tài)鏈表的方式來實現(xiàn)。
一般動態(tài)鏈表用在底層操作系統(tǒng)比較多,通常用來做消息隊列或者是任務(wù)創(chuàng)建。
以上是“C語言中如何使用鏈表”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。