服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言结构体使用之链表

C语言结构体使用之链表

2022-10-13 13:45Embedded learner C/C++

这篇文章主要介绍了C语言结构体使用之链表,下面文章主要围绕结构体的概念和用法、结构体数组和结构体指针、包含结构体的结构体、结构体搭建链表方法、结构体及链表在产品应用场景等多个主题展开链表的相关资料,需要的

一、结构体的概念

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

二、结构体的用法

1、struct 结构体名称 访问方法: 结构体变量名.成员

?
1
2
3
4
{undefined
成员1;
成员2;
};

2、 typedef struct

?
1
2
3
4
{undefined
成员1;
成员2;
}结构体名称;

在中大型产品中一般用第2种,因为结构体多了以后通过别名的方式定义结构体变量能够大大提高代码可读性。

三、结构体数组和指针

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

四、结构体指针

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

  • 1、直接用struct声明一个结构体,然后在定义结构体指针,struct 结构体名称 *结构体指针变量名
  • 2、用typedef struct声明一个结构体,并且为结构体重命名,通过别名的方式定义结构体指针。结构体别名 *结构体指针变量名

结构体指针访问成员方法 结构体指针变量名->成员名

五、包含结构体的结构体

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

C语言结构体使用之链表

六、链表

在数据结构里面,有一种数据结构叫做链表,链表通俗的说就是把多个结构体变量像铁链一样环环相扣连接起来,我们拿4个学生数据组成的链表来举例,分析链表具体的工作原理。

C语言结构体使用之链表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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语言链表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_44795447/article/details/123186546

延伸 · 阅读

精彩推荐
  • C/C++深入浅析 C++ 调用 Python 模块

    深入浅析 C++ 调用 Python 模块

    Python 提供了 C++ 库,使得开发者能很方便地从 C++ 程序中调用 Python 模块。接下来通过本文给大家介绍 C++ 调用 Python 模块的相关知识,需要的朋友参考下吧...

    C++教程网10712021-03-27
  • C/C++Qt实现闹钟小程序

    Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    飘云之下9952021-08-01
  • C/C++C++ 中友元函数与友元类详解

    C++ 中友元函数与友元类详解

    这篇文章主要介绍了C++ 中友元函数与友元类详解的相关资料,需要的朋友可以参考下...

    ab1986044032021-05-19
  • C/C++C++ 函数的介绍

    C++ 函数的介绍

    本篇主要介绍了函数的基础概念以及一些特殊的函数方法和类型,函数重载以及函数指针,下面一起进入文章学习详细的内容吧,需要的朋友也可以参考一下...

    一个热爱学习的深度渣渣10102022-03-10
  • C/C++基于C++全局变量的声明与定义的详解

    基于C++全局变量的声明与定义的详解

    本篇文章是对C++全局变量的声明与定义进行了详细的分析介绍,需要的朋友参考下...

    C++教程网3952020-12-14
  • C/C++哈希表实验C语言版实现

    哈希表实验C语言版实现

    以下是对哈希表实验用C语言实现的代码进行了详细的分析介绍,需要的朋友可以参考下...

    C语言教程网1702020-12-18
  • C/C++c语言二进制数按位输出示例

    c语言二进制数按位输出示例

    这篇文章主要介绍了c语言二进制数按位输出示例,需要的朋友可以参考下...

    C语言程序设计11982021-01-17
  • C/C++CFileDialog的钩子函数解决对话框的多选之DoModal问题

    CFileDialog的钩子函数解决对话框的多选之DoModal问题

    前几天领导问我一个问题:就是使用CFileDialog类在设置多选时选中的文件所放的文件缓冲区不知设置多大合适,本文将详细介绍,需要的朋友可以参考下...

    C++教程网2172020-11-13