数据结构(Day15)

一、学习内容

  1. 结构体位域

    #include <myhead.h>typedef struct
    {int a:2;short b:1;char c:1;
    }m1;typedef struct
    {char a:3;short b:7;int c:10;
    }m2;
    int main(int argc, const char *argv[])
    {printf("%ld\n",sizeof(m1));printf("%ld\n",sizeof(m2));return 0;
    }

  2. 共用体(union)

    • 概念

      • 与结构体一样,自定义类型,允许在同一内存上存储不同类型的变量,但是多个变量一次只能使用或者赋值一个变量,多个变量共享内存空间。

    • 作用

      • 节约内存空间,多个变量共享一个内存空间。

    • 定义格式

      • union EUM { 类型1 成员1; 类型2 成员2; 类型3 成员3; };

    • 共用体注意事项

      • 内存占用,所有基础成员中最大的成员所占大小就是联合体内存大小。

      • 赋值或者使用时,一次只能赋值或者使用一个成员变量。

    • 共用体初始化

      •  #include <myhead.h>union EMU
        {int age;char a;short b;double c;
        };int main(int argc, const char *argv[])
        {union EMU www;www.age = 200;www.a  ='W';www.b = 10;www.c = 120;printf("www.age = %d\n",www.age);//第一个赋值可以输出printf("www.a = %c\n",www.a);//第一个被第二个覆盖掉printf("www.b = %d\n",www.b);//第二个被第三个覆盖掉printf("www.c = %lf\n",www.c);//第三个被第四个覆盖掉return 0;
        }

  3. 枚举

    • 枚举实际就是枚举常量

    • 定义格式

      • 枚举常量: 定义格式: enum 枚举名 { 成员1,成员2,成员3,成员4 };

        • 枚举成员直接使用,不需要结构体或者联合体那样引用。

        • 默认第一个成员是0,如果给第一个成员赋值,后面成员依次累加1

    • 枚举的初始化

  4. 数据结构绪论

    • 概念

      • 数据的组织方式,施加在数据上的一组操作,(增删改查等)

    • 数据

      • 能被计算机识别存储处理的符号集合

        • 数据分为数值类型和非数值类型

        • 数值:int a,123,float b;等我们熟知的变量和常量都是数值数据。

        • 非数值:mp3,光盘,磁带,电影视频。

    • 数据对象

      • 多个数据对象构成了数据

        • 例如:24081班,24071班,24091班 都属于数据对象,构成上海中心属于数据。

    • 数据元素

      • 多个数据元素构成了数据对象

        • 例如:24081班有27个(学生)数据元素。

    • 数据项

      • 数据元素的最小组成单位

        • 例如:数据元素张震有两条腿,有耳朵,有嘴,这些都是组成数据元素的最小单位。

        • 数据>数据对象>数据元素>数据项

        • 数据元素是组成数据的基本单位,数据项是数据的最小单位。

    • 数据结构体分为逻辑结构和物理结构体

      • 数据结构

        • 逻辑结构

          • 集合结构:数据元素之间没有关系

          • 线性结构:数据元素一对一的关系

          • 树形结构:数据元素一对多的关系

          • 图形结构:数据元素多对多的关系

        • 物理结构(真实的结构)

          • 顺序存储

            • 逻辑相邻的元素物理上也相邻

          • 链式存储

            • 逻辑相邻的元素物理上不一定相邻

          • 散列存储

            • 哈希存储,数据元素的存储和哈希函数和关键字有关(了解)

          • 索引存储

            • 在存储数据元素时建立一个索引表,以便快速查找

    • 顺序存储和链式存储的区别

        • 顺序存储必须占用连续的内存空间。

        • 链式存储内存空间连续与否均可。

        • 链式存储时节点体积较小,可以充分利用内存碎片。

        • 相同节点个数的顺序存储和链式存储,链式存储占用内存较多。

        • 链式存储和顺序存储都有优缺点,不能单纯的认为链式或者顺序存储较好。

  5. 线性表(部分)

    • 例如:顺序表,顺序栈,顺序队列,顺序串,单链表,双链表,循环链表都属于线性表。

        • 第一个元素没有前驱最后一个元素没有后继。

        • 中间 的元素都有唯一的前驱和唯一的后继,元素之间一对一关系。

    • 顺序表

      • 概念

        • 数据元素之间采用顺序存储的方式。

        • 数据元素之间占用连续的内存空间。

        • 采用数组存储顺序表。

    • 实现方式

        • 借助数组来存储顺序表。

        • 数组长度固定

        • 顺序表长度可变。

        • 顺序表长度<=数组长度。

    • 顺序表的组成

      • 顺序表借助数组来存储,封装结构体时需要封装数组。

      • 顺序表长度不固定,所以还需要封装计数器,统计顺序表元素个数。

      • 结构体内部成员data和len,不能直接使用,必须使用指针L来引用成员。

  6. 脑图

二、作业

1.定义结构体数组存储5个学生的信息:姓名,年龄,性别

定义函数实现输入,要求形参使用结构体指针接收

函数实现5个学生年龄排序(注意对年龄排序时,交换的是所有信息)

定义函数实现输出,要求形参使用结构体指针接收 

代码解答:

#include <myhead.h>// 定义学生结构体,包含姓名、年龄和性别
typedef struct {char name[20];  // 存储学生的姓名,最大长度 20int age;        // 存储学生的年龄char sex[10];   // 存储学生的性别,最大长度 10,考虑 "female" 等情况
} stu, *sstu;// 输入学生信息函数,参数为指向学生结构体数组的指针
int input_stu(sstu S) {for (int i = 0; i < 5; i++) {// 输入学生的姓名printf("请输入学生的名字:");fgets(S[i].name, sizeof(S[i].name), stdin);S[i].name[strcspn(S[i].name, "\n")] = 0; // 移除 fgets 读取的换行符// 输入学生的年龄printf("请输入学生的年龄:");scanf("%d", &S[i].age);// 输入学生的性别printf("请输入学生性别:");scanf("%s", S[i].sex);// 吃掉输入缓冲区中的多余换行符,避免下次 fgets 读取到它getchar();printf("\n");}return 0;
}// 输出学生信息函数,参数为指向学生结构体数组的指针
int output_stu(sstu S) {for (int i = 0; i < 5; i++) {// 打印学生的姓名、年龄和性别信息printf("%s\t%d\t%s\n", S[i].name, S[i].age, S[i].sex);}return 0;
}// 根据年龄对学生进行排序的函数,参数为指向学生结构体数组的指针
int sort_stu(sstu S) {stu temp; // 用于临时存储学生信息的变量// 冒泡排序,按年龄从小到大排序for (int i = 0; i < 5 - 1; i++) {for (int j = 0; j < 5 - i - 1; j++) {if (S[j].age > S[j + 1].age) {// 交换两个学生的所有信息temp = S[j];S[j] = S[j + 1];S[j + 1] = temp;}}}return 0;
}// 主函数
int main(int argc, const char *argv[]) {// 动态分配内存,存储 5 个学生的结构体数组sstu S = (sstu)malloc(sizeof(stu) * 5); // 强制转换 malloc 返回的 void* 类型为 sstu 类型// 调用输入函数,输入 5 个学生的信息input_stu(S);// 调用排序函数,按年龄排序sort_stu(S);// 调用输出函数,输出排序后的学生信息output_stu(S);// 释放之前分配的动态内存,避免内存泄漏free(S);S = NULL; // 防止悬空指针return 0;
}

结果展现:

2.定义小车结构体,存储名称、价钱、颜色。定义两个变量a,b,初始化,实现ab互换。

代码解答:

#include <myhead.h>// 定义小车结构体,包含名称、价钱和颜色
typedef struct {char name[20];   // 小车的名称float price;     // 小车的价格char color[10];  // 小车的颜色
} car;int main() {// 定义两个小车变量 a 和 bcar a = {"Toyota", 20000.0, "Red"};   // 初始化 acar b = {"BMW", 18000.0, "Blue"};   // 初始化 b// 打印互换前的小车信息printf("交换前:\n");printf("a: %s, %.2f, %s\n", a.name, a.price, a.color);printf("b: %s, %.2f, %s\n", b.name, b.price, b.color);// 互换 a 和 b 的信息car temp = a;a = b;b = temp;// 打印互换后的小车信息printf("\n交换后:\n");printf("a: %s, %.2f, %s\n", a.name, a.price, a.color);printf("b: %s, %.2f, %s\n", b.name, b.price, b.color);return 0;
}

成果展现:

三、总结

学习内容概述

1. 位域(Bit Fields)

位域是一种能够在结构体内存中精确控制数据成员所占位数的技术。主要用于节省内存,尤其在硬件寄存器中使用。

2. 共用体(Union)

共用体是一种允许多个成员共享同一块内存的自定义类型,可以有效节省内存,但同一时间只能使用一个成员。

3. 枚举(Enum)

 枚举用于定义一组命名常量,通常用于表示有限的、互斥的选项。枚举成员默认从 0 开始,也可以手动赋值。

4. 数据结构基本概念

数据:由数值类型和非数值类型组成,能被计算机存储和处理的符号集合。

数据:元素是构成数据的基本单位。

数据项:是数据元素的最小组成单位。

数据结构分类:

逻辑结构:集合结构、线性结构、树形结构、图形结构。

物理结构:顺序存储、链式存储、哈希存储、索引存储。

5. 线性表

线性表是一种具有一对一数据元素关系的数据结构,包含顺序表和链表等具体实现。

学习难点

1. 位域的内存对齐与实际内存使用:

如何在不同类型的数据之间正确分配位数,避免内存浪费。

2. 共用体的使用规则:

理解如何在不损坏数据的情况下有效利用内存,尤其是当不同类型数据共存时。

3. 数据结构的逻辑与物理存储差异:

如何根据需求选择合适的存储方式(顺序存储与链式存储)以优化性能。

4. 线性表的实现:

如何合理使用数组实现顺序表,并动态管理顺序表长度。

主要事项

1. 位域:

理解位域的数据成员如何分配位数,以及不同类型的数据成员的最大限制。

2. 共用体:

在使用共用体时,确保一次只能使用一个成员,防止数据覆盖。

3. 顺序存储与链式存储的权衡:

顺序存储适用于访问速度快的场景,而链式存储适合内存不连续的场景。理解何时应选用哪种存储方式。

4. 线性表的动态性:

顺序表使用数组存储,但数组长度是固定的。要确保顺序表不会超过数组长度,并且能够灵活扩展。

未来学习重点

1. 深入理解位域的应用场景:

特别是在嵌入式系统和硬件编程中,通过位域节省内存的实际应用。

2. 共用体在复杂场景中的使用:

探索如何在资源受限的场景下合理使用共用体,同时避免数据丢失或覆盖。

3. 链表的深入学习:

链式存储的优势在于节省内存碎片以及动态扩展能力,后续可重点学习单链表、双链表及其操作。

4. 复杂数据结构的实现:

在掌握顺序表和链式存储的基础上,未来可以探索栈、队列、哈希表和树等更复杂的数据结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144146.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab simulink建模与仿真 第十八章(Stateflow状态机)

参考视频&#xff1a;Simulink/stateflow的入门培训_哔哩哔哩_bilibili 一、概述 Stateflow是集成于Simulink中的图形化设计与开发工具&#xff0c;主要用于针对控制系统中的复杂控制逻辑进行建模与仿真&#xff0c;或者说&#xff0c;Stateflow适用于针对事件响应系统进行建模…

物联网系统中如何通过光电效应实现位置监测_光电传感器

物联网系统中为什么要使用光电传感器 物联网系统中使用光电传感器的原因可以归结为以下几个方面&#xff1a; 一、光电传感器的特性与优势 非接触性&#xff1a;光电传感器通过光线与物体相互作用来进行探测和测量&#xff0c;无需直接接触被测物体&#xff0c;避免了对物体的…

基于web的工作管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

如何使用ssm实现大湾区旅游推荐系统的设计与实现+vue

TOC ssm621大湾区旅游推荐系统的设计与实现vue 第1章 绪论 1.1 研究背景意义及内容 1.1.1 研究背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域…

【Python百日进阶-Web开发-FastAPI】Day802 - FastAPI安装和起步

文章目录 一、安装 FastAPI1.1 进入虚拟环境1.2 安装FastAPI及所有相关依赖1.3 可以分开来安装二、第一步2.1 最简单的FastAPI应用2.2 uvicorn.run() 常用参数2.3 交互式 API 文档2.3.1 docs文档(由 Swagger UI 提供)2.3.2 docs文档空白解决方案2.3.2.1 解决方法1:更新FastA…

Python OpenCV精讲系列 - 高级图像处理技术(八)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

软件卸载工具(windows系统)-geek

有时候软件卸载会很麻烦&#xff0c;使用geek会比较方便。但是针对一些特别大的软件&#xff0c;geek也好像会稍微费点劲&#xff08;比如MATLAB2022A&#xff09;,不过针对一般常规软件的卸载&#xff0c;geek就可以有效地完全卸载了&#xff0c;使用方法也很简单&#xff0c;…

【Elasticsearch系列十二】聚合-电视案例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue3 中 Aos 动画同时触发的解决办法

文章目录 问题现象解决之后的效果解决办法问题猜测 问题现象 我总共有四行数据&#xff0c;每一行都是一个动画&#xff0c;但是触发第一个之后其他三个也都触发了 我想要的效果是&#xff1a;动画从底部出现的时候触发一个动画&#xff0c;不要都触发掉 解决之后的效果 解决…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

uni-data-select 使用 localdata 传入数据出现 不回显 | 下拉显示错误的 解决方法

目录 1. 问题所示2. 正确Demo3. 下拉显示错误(Bug复现)4. 下拉不回显(Bug复现)1. 问题所示 uni-app的下拉框uni-data-select 使用 localdata 传入数据 主要总结正确的Demo以及复现一些Bug 数据不回显数据不显示下拉选项2. 正确Demo 详细的基本知识推荐阅读:uni-app中的…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spring Boot&#xff1a;作为后端框架&#xff0c;用来提供数据接口。Thymeleaf&#xff1a;作为前端模板引擎&#xff0c;呈现网页。Leaflet…

图书馆座位预约系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;图书馆管理&#xff0c;座位信息管理&#xff0c;预约选座管理&#xff0c;签到信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;论坛&#xf…

力扣最热一百题——缺失的第一个正数

目录 题目链接&#xff1a;41. 缺失的第一个正数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;标记数组法 1. 将非正数和超出范围的数替换 2. 使用数组下标标记存在的数字 3. 找到第一个未标记的位置 4. 为什么时间复杂…

【Vue】- 路由及传参

文章目录 知识回顾前言源码分析1. 声明式导航2. 路由传参3. 可选符4. 重定向5. 4046. 跳转及传参7. 路由懒加载拓展知识总结router-link静态传参和动态路由的对比知识回顾 前言 什么是单页面应用程序? ● 所有功能在一个html页面上实现 单页面应用优缺点? ● 优点:按需更新…

Python | Leetcode Python题解之第415题字符串相加

题目&#xff1a; 题解&#xff1a; class Solution:def addStrings(self, num1: str, num2: str) -> str:res ""i, j, carry len(num1) - 1, len(num2) - 1, 0while i > 0 or j > 0:n1 int(num1[i]) if i > 0 else 0n2 int(num2[j]) if j > 0 e…

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容&#xff1a; [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…

[Linux]从零开始的泰山派系统安装与远程教程

一、前言 泰山派买回来也有一阵子了&#xff0c;最近慢慢开始研究。当然&#xff0c;学习这种Linux的开发板的第一步就是安装系统&#xff0c;对于RK系列的芯片系统安装有专门的软件&#xff0c;所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统&#xff0c;这一…

电脑端视频剪辑软件哪个好用,十多款剪辑软件分享

随着自媒体时代的蓬勃发展&#xff0c;视频创作已成为营销战略与社交媒体互动中不可或缺的一环&#xff0c;这极大地推动了视频编辑技术的普及与兴盛。今天&#xff0c;我将为大家精选并介绍15款当前市场上广受欢迎的视频剪辑工具及配套软件&#xff0c;旨在帮助大家更高效地进…

YOLO混凝土缺陷检测数据集

YOLO混凝土缺陷检测 数据集 模型 ui界面 ✓图片数量7353&#xff0c;模型已训练200轮&#xff1b; ✓类别&#xff1a;exposed reinforcement&#xff0c;rust stain&#xff0c;Crack&#xff0c;Spalling&#xff0c;Efflorescence&#xff0c;delamination&#xff08;外露…