设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 别怀疑自己,别改变自己。别在意别人怎么想,大胆去追求自己想要的。

别怀疑自己,别改变自己。别在意别人怎么想,大胆去追求自己想要的。

查看: 1212|回复: 3

C语言结构体使用之链表

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:204
  • 打卡月天数:0
  • 打卡总奖励:3189
  • 最近打卡:2023-08-27 09:08:14
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
410
主题
382
精华
0
金钱
4383
积分
819
注册时间
2022-12-20
最后登录
2025-5-31

发表于 2023-2-13 13:02:52 | 显示全部楼层 |阅读模式
一、结构体的概念

比如说学生的信息,包含了学生名称、学号、性别、年龄等信息,这些参数可能有些是数组型、字符型、整型、甚至是结构体类型的数据。虽然这些都是不同类型的数据,但是这些都是用来表达学生信息的数据。

二、结构体的用法

1、struct 结构体名称 访问方法: 结构体变量名.成员
  1. {undefined
  2. 成员1;
  3. 成员2;
  4. };
复制代码
2、 typedef struct
  1. {undefined
  2. 成员1;
  3. 成员2;
  4. }结构体名称;
复制代码
在中大型产品中一般用第2种,因为结构体多了以后通过别名的方式定义结构体变量能够大大提高代码可读性。

三、结构体数组和指针


  • 1、直接用struct声明一个结构体,然后在定义结构体数组,struct 结构体名称 数组名[数组大小]
  • 2、用
    1. typedef struct
    复制代码
    声明一个结构体,并且为结构体重命名,通过重命名的方法定义结构体数组。结构体重命名 数组名[数组大小]

四、结构体指针

只要是存储在内存中的变量或者数组或函数编译器都会为他们分配一个地址,我们可以通过指针变量指向这个地址来访问地址里面的数,只要把指针变量定义成同数据类型就可以指向了,比如说要指向字符型变量就定义字符型指针变量,所以我们也可以定义结构体类型指针来指向它。

  • 1、直接用
    1. struct
    复制代码
    声明一个结构体,然后在定义结构体指针,struct 结构体名称 *结构体指针变量名
  • 2、用
    1. typedef struct
    复制代码
    声明一个结构体,并且为结构体重命名,通过别名的方式定义结构体指针。结构体别名 *结构体指针变量名
结构体指针访问成员方法 结构体指针变量名->成员名

五、包含结构体的结构体

学生信息包含姓名,学号,性别,出入日期等数据,而出生日期又包含年月日这3个成员,所以把出生日期单独声明一个结构体,那么学生这个结构体就包含出生日期这个结构体,这种就是包含结构体的结构体。
140438fgqgeq6r9x3gp4rn.png


六、链表

在数据结构里面,有一种数据结构叫做链表,链表通俗的说就是把多个结构体变量像铁链一样环环相扣连接起来,我们拿4个学生数据组成的链表来举例,分析链表具体的工作原理。
140439hzef8qk2gdl0883z.png
  1. #include<stdio.h>
  2. /*只要具备多种属性就可以用结构体来构造;比如串口具有多种信息,时钟源,波特率,停止位,校验位*/
  3. typedef struct{
  4.     unsigned short Year;
  5.     unsigned char Mon;
  6.     unsigned char Day;
  7. }today;/*这个结构体只是构造一下,本程序没有用到*/
  8. struct student{
  9.     unsigned char Name[20];
  10.     unsigned char number;
  11.     unsigned char sex;
  12.     student *pLast; /*双向链表*/ 
  13.     student *pNext;
  14. };

  15. int main()
  16. {
  17.     unsigned char i;
  18.     struct student *pStu;
  19.       struct student stu1[4] =
  20.     {
  21.         {"stu1",1,'m',0,0},
  22.         {"stu2",2,'m',0,0},
  23.          {"stu3",3,'m',0,0},
  24.           {"stu4",4,'m',0,0},    
  25.       };

  26.     stu1[0].pNext = &stu1[1];
  27.     stu1[1].pNext = &stu1[2];
  28.     stu1[2].pNext = &stu1[3];    
  29.     stu1[3].pLast = &stu1[2];
  30.     stu1[2].pLast = &stu1[1];
  31.     stu1[1].pLast = &stu1[0];
  32.     pStu = &stu1[0];
  33.         
  34.     for(i=0;i<4;i++)
  35.     {
  36.     printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex);
  37.     pStu = pStu->pNext;        
  38.     }
  39.     pStu = &stu1[3];
  40.     printf("\r\n");    
  41.     for(i=0;i<4;i++)
  42.     {
  43.     printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex);
  44.     pStu = pStu->pLast;        
  45.     }        
  46.         
  47.     return 0;
  48. }
复制代码
链表是基于结构体的一种线性的数据结构。
结构体的应用非常广泛,这里我们记住一个黄金法则:只要是具备多种属性的任何东西,都可以用结构体来构造,我们把这个东西叫做对象。比如说单片机的串口是不是有时钟源、波特率、停止位、校验位这些属性?那么串口就是一个对象,可以用结构体来构造。

七、静态链表

上面的链表是4个学生信息的结构体变量连接在一起,这种是静态的链表,意思就是连接在一起的结构体变量数量是固定的,静态创建链表的方法适用于一些固定好数量的数据结构。比如产品需要在LCD上面显示多级菜单架构,一般使用按键或者触摸去进入子菜单或者返回主菜单,那么就可以把这些主菜单和子菜单做成一个链表,那么配合结构体指针就可以很轻松的找到需要跳转的菜单了,像这种菜单结构往往在功能定义的时候就要规划清楚一共需要多少个菜单,每一个菜单有那些共同的属性。

八、动态链表

动态链表的意思就是通过动态分配的方式把结构体变量连接起来,这种结构体变量的数量是未知的,会随着某种条件增加或减少结构体变量的数量。比如说我要接收串口的数据,如果串口一次性接收10个数据那么很好处理,我们直接定义一个数组,把大小设置成10就可以了。那如果我们不知道到底串口会来多少个数据的情况下,比如说有可能这一帧来100个,下一帧来1000个,那用数组来存储是不是就很不方便,不知道到底该分配多大的数组,如果分配大小为1000的数组就会造成内存浪费,像我们就可以使用动态链表的方式来实现。
一般动态链表用在底层操作系统比较多,通常用来做消息队列或者是任务创建。
到此这篇关于C语言结构体使用之链表的文章就介绍到这了,更多相关C语言链表内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:25
  • 最近打卡:2024-08-10 15:43:46
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
41
积分
8
注册时间
2023-11-12
最后登录
2024-8-10

发表于 2024-9-5 04:22:25 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
14
积分
8
注册时间
2023-12-14
最后登录
2023-12-14

发表于 2025-2-23 19:55:47 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:24
  • 打卡月天数:0
  • 打卡总奖励:311
  • 最近打卡:2025-06-29 04:20:04
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
352
积分
50
注册时间
2023-1-8
最后登录
2025-6-29

发表于 7 天前 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表