C语言结构体使用之链表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语⾔结构体使⽤之链表
⽬录
⼀、结构体的概念
⼆、结构体的⽤法
三、结构体数组和指针
四、结构体指针
五、包含结构体的结构体
六、链表
七、静态链表
⼋、动态链表
⼀、结构体的概念
⽐如说学⽣的信息,包含了学⽣名称、学号、性别、年龄等信息,这些参数可能有些是数组型、字符型、整型、甚⾄是结构体类型的数据。
虽然这些都是不同类型的数据,但是这些都是⽤来表达学⽣信息的数据。
⼆、结构体的⽤法
1、struct 结构体名称访问⽅法:结构体变量名.成员
{undefined
成员1;
成员2;
};
2、 typedef struct
{undefined
成员1;
成员2;
}结构体名称;
在中⼤型产品中⼀般⽤第2种,因为结构体多了以后通过别名的⽅式定义结构体变量能够⼤⼤提⾼代码可读性。
三、结构体数组和指针
1、直接⽤struct声明⼀个结构体,然后在定义结构体数组,struct 结构体名称数组名[数组⼤⼩]
2、⽤typedef struct声明⼀个结构体,并且为结构体重命名,通过重命名的⽅法定义结构体数组。
结构体重命名数组名[数
组⼤⼩]
四、结构体指针
只要是存储在内存中的变量或者数组或函数编译器都会为他们分配⼀个地址,我们可以通过指针变量指向这个地址来访问地址⾥⾯的数,只要把指针变量定义成同数据类型就可以指向了,⽐如说要指向字符型变量就定义字符型指针变量,所以我们也可以定义结构体类型指针来指向它。
1、直接⽤struct声明⼀个结构体,然后在定义结构体指针,struct 结构体名称 *结构体指针变量名
2、⽤typedef struct声明⼀个结构体,并且为结构体重命名,通过别名的⽅式定义结构体指针。
结构体别名 *结构体指针变
量名
结构体指针访问成员⽅法结构体指针变量名->成员名
五、包含结构体的结构体
学⽣信息包含姓名,学号,性别,出⼊⽇期等数据,⽽出⽣⽇期⼜包含年⽉⽇这3个成员,所以把出⽣⽇期单独声明⼀个结构体,那么学⽣这个结构体就包含出⽣⽇期这个结构体,这种就是包含结构体的结构体。
六、链表
在数据结构⾥⾯,有⼀种数据结构叫做链表,链表通俗的说就是把多个结构体变量像铁链⼀样环环相扣连接起来,我们拿4个学⽣数据组成的链表来举例,分析链表具体的⼯作原理。
#include<stdio.h>
/*只要具备多种属性就可以⽤结构体来构造;⽐如串⼝具有多种信息,时钟源,波特率,停⽌位,校验位*/
typedef struct{
unsigned short Year;
unsigned char Mon;
unsigned char Day;
}today;/*这个结构体只是构造⼀下,本程序没有⽤到*/
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;
}
链表是基于结构体的⼀种线性的数据结构。
结构体的应⽤⾮常⼴泛,这⾥我们记住⼀个黄⾦法则:只要是具备多种属性的任何东西,都可以⽤结构体来构造,我们把这个东西叫做对象。
⽐如说单⽚机的串⼝是不是有时钟源、波特率、停⽌位、校验位这些属性?那么串⼝就是⼀个对象,可以⽤结构体来构造。
七、静态链表
上⾯的链表是4个学⽣信息的结构体变量连接在⼀起,这种是静态的链表,意思就是连接在⼀起的结构体变量数量是固定的,静态创建链表的⽅法适⽤于⼀些固定好数量的数据结构。
⽐如产品需要在LCD上⾯显⽰多级菜单架构,⼀般使⽤按键或者触摸去进⼊⼦菜单或者返回主菜单,那么就可以把这些主菜单和⼦菜单做成⼀个链表,那么配合结构体指针就可以很轻松的找到需要跳转的菜单了,像这种菜单结构往往在功能定义的时候就要规划清楚⼀共需要多少个菜单,每⼀个菜单有那些共同的属性。
⼋、动态链表
动态链表的意思就是通过动态分配的⽅式把结构体变量连接起来,这种结构体变量的数量是未知的,会随着某种条件增加或减
少结构体变量的数量。
⽐如说我要接收串⼝的数据,如果串⼝⼀次性接收10个数据那么很好处理,我们直接定义⼀个数组,把⼤⼩设置成10就可以了。
那如果我们不知道到底串⼝会来多少个数据的情况下,⽐如说有可能这⼀帧来100个,下⼀帧来1000个,那⽤数组来存储是不是就很不⽅便,不知道到底该分配多⼤的数组,如果分配⼤⼩为1000的数组就会造成内存浪费,像我们就可以使⽤动态链表的⽅式来实现。
⼀般动态链表⽤在底层操作系统⽐较多,通常⽤来做消息队列或者是任务创建。
到此这篇关于C语⾔结构体使⽤之链表的⽂章就介绍到这了,更多相关C语⾔链表内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。