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语言链表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言类的双向链表详解

    目录 前言 双向链表的定义 双向链表的创建 节点的创建 双向链表节点查找 双向链表的插入 双向链表的节点删除 双向链表的删除 总结 前言 链表(linked list)是一种这样的数据结构,其中的各对象按线性排列.数组的线性顺序是由数组下标决定的,然而于数组不同的是,链表的各顺序是由链表中的指针决定的. 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循

  • C语言链表实现工资管理系统

    本文实例为大家分享了C语言链表实现工资管理系统的具体代码,供大家参考,具体内容如下 自己的作业,分享一下,自己为了调试方便,又多加入了一些功能 题目:建立工资管理系统,对职工工资的相关信息进行管理.职工工资相关信息包括职工工号,职工姓名,月份,每月工资和年度总工资等,具体要求如下; 1.建立该系统的存储结构2.录入职工某个月的工资3.查找某个职工某个月的工资4.修改某个职工某个月的工资5.删除每个职工的工资相关信息6.统计某个职工年度总工资7.对职工的月工资或年度总工资进行排名 源码 #incl

  • C语言使用链表实现学生籍贯管理系统

    本文实例为大家分享了C语言用链表实现学生籍贯管理系统的具体代码,供大家参考,具体内容如下 源码 #include<stdio.h> #include<stdlib.h> #include<string.h> //定义一个学生结构体 typedef struct student {     char no[12];            //学号     char name[40];          //姓名     char tele[20];          //

  • C语言数据结构与算法之单链表

    目录 基本概念 读取数据元素 获取第i个结点的数据元素 插入数据元素  初始化链表 打印链表 顺序表查空 顺序表的删除  删除第i个结点及其数据元素 情况1:当删除的是第一个元素 情况2:除第一个结点外 完整代码 删除单链表整表 单链表VS顺序表 基本概念 链表的每一个结点中只包含一个指针域 优点 : 储存空间利用高效 举例来说: typedef struct student{ int id; //学生编号 char* name; //学生名称 //指向下一结点的指针 struct Studen

  • 一起来看看C语言线性表的线性链表

    目录 定义 1.插入 2.建立线性链表 1)头插法 2)尾插法 3.删除 4.查找 5.求线性链表的表长 总结 定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,每一个结点包含两个域:存放数据元素信息的域称为数据域,存放其后继元素地址的域称为指针域.因此n个元素的线性表通过每个结点的指针域连接成了一个“链条”,称为链表.若此链表的每个结点中只包含一个指针域,则被称为线性链表或单链表. 线性表的链式存储结构,它不需要用地址连续的存储单元来实现,因为它不要求逻辑上相邻的两个数据元素物理位置

  • C语言链表与单链表详解

    链表是什么及链表的优势 链表是一种介于数组的另外一种数据结构: 我们知道数组可以存放很多的元素,这些元素都是呈线性排列,也就是一个挨着一个连续存放 但是当元素足够多时,还能继续正常的存放吗? 事实上的不可以的,虽然系统的内存足够大,但是这些内存不都是连续的,这就导致会出现没有足够的空间去存储这些元素. 其次就是数组的大小需要你去申请,如果你申请的空间足够大,就会导致内存的浪费 而链表就很好的解决了这两个问题 链表的组成 链表的作用就是相当与数组一样,储存你数据的 但又不同于数组,链表把每一个游离

  • C语言结构体使用之链表

    目录 一.结构体的概念 二.结构体的用法 三.结构体数组和指针 四.结构体指针 五.包含结构体的结构体 六.链表 七.静态链表 八.动态链表 一.结构体的概念 比如说学生的信息,包含了学生名称.学号.性别.年龄等信息,这些参数可能有些是数组型.字符型.整型.甚至是结构体类型的数据.虽然这些都是不同类型的数据,但是这些都是用来表达学生信息的数据. 二.结构体的用法 1.struct 结构体名称 访问方法: 结构体变量名.成员 {undefined 成员1: 成员2: }: 2. typedef s

  • Go 语言结构体链表的基本操作

    目录 1. 什么是链表 2. 单项链表的基本操作 3. 使用 struct 定义单链表 4. 尾部添加节点方法一 5. 头部插入节点方法一 6. 指定节点后添加新节点 7. 删除节点 1. 什么是链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 使用链表结构可以避免在使用数组

  • C语言结构体链表和指针实现学生管理系统

    本文实例为大家分享了C语言结构体链表和指针实现学生管理系统的具体代码,供大家参考,具体内容如下 一.需求分析 通过使用“学生管理系统”,可以更加有效地对学生实现管理,完成对学生基本信息以及成绩信息的文件保存,具有信息的增加,删除.查询以及修改等功能,能提供简单的数据统计.分析信息. 二.整体设计 学生管理系统 主要由两大功能模块组成,分别是是“学生档案管理”和“学生成绩管理“两个子系统.整体模块架构如下: 三.详细设计 学生档案管理子系统 用户选择 进入“学生档案管理”子系统,显示该子系统菜单,

  • C语言结构体指针引用详解

    目录 指向结构体变量的指针 指向结构体数组的指针 结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针. 指向结构体变量的指针 前面我们通过"结构体变量名.成员名"的方式引用结构体变量中的成员,除了这种方法之外还可以使用指针. 前面讲过,&student1 表示结构体变量 student1 的首地址,即 student1 第一个项的地址.如果定义一个指针变量 p 指向这个地址的话,p 就可以指向结构体变量 student1 中的任意一个成员. 那么,这个指针变量定义成

  • php读取二进制流(C语言结构体struct数据文件)的深入解析

    尽管php是用C语言开发的,不过令我不解的是php没有提供对结构体struct的直接支持.不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转: 复制代码 代码如下: string pack ( string $format [, mixed $args [, mixed $...]] )   //Pack given arguments into binary string according to format.  array unp

  • C语言 结构体(Struct)详解及示例代码

    前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{     结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可

  • C语言结构体(struct)常见使用方法(细节问题)

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的"结构体变量"的初始化的结构体定义 //直接带变量名Huqinwei struct stuff{ char job[20]; int age; floa

  • Go语言结构体定义和使用方法

    本文实例讲述了Go语言结构体定义和使用方法.分享给大家供大家参考.具体分析如下: 一个结构体(struct)就是一个字段的集合. (而 type 定义跟其字面意思相符.) 复制代码 代码如下: package main import "fmt" type Vertex struct {     X int     Y int } func main() {     fmt.Println(Vertex{1, 2}) } 结构体字段使用点号来访问. 复制代码 代码如下: package

  • C语言 结构体数组详解及示例代码

    所谓结构体数组,是指数组中的每个元素都是一个结构体.在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生.一个车间的职工等. 定义结构体数组和定义结构体变量的方式类似,请看下面的例子: struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 }class[5]; 表示一个班级有5个学生. 结构体数组在定义的同时也可以初始化,例如: str

  • C语言结构体定义的方法汇总

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问. 结构体与数组的比较 (1) 都由多个元素组成 (2) 各个元素在内存中的存储空间是连续的 (3) 数组中各个元素的数据类型相同,而结构体中的各个元素的数据类型可以不相同 结

随机推荐