C语言—再学习(结构体)

一、建立结构体

用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。

struct Student 
{  int num;       //学号char name[20]; //名字为字符串char sex;       //性别int age;         //年纪float score;     //分数char addr[30];   地址为字符串
};   //注意最后有分号

可以看到先是指定一个结构体类型  struct Student (struct 是声明, 结构体类型时候必须压迫使用的关键字,不能省略!!!!),它向编译系统声明:这是一个“结构体类型”,它包括num,name,sex,age,score,addr等不同类型成员。

所以一般形式为:

struct 结构体名

{

 成员列表

} ;            //别忘了分号

花括号里的成员列表:  类型名  成员名;

二、定义一个结构体变量

开头声明的Student 结构体,可以用它来定义变量。 

1.先声明结构体,再定义变量。

例如:  struct Student  student1 , student2;

这样student1和student2就具有和Student类型的结构了。

2.在声明类型的同时定义变量

struct Student 
{  int num;       //学号char name[20]; //名字为字符串char sex;       //性别int age;         //年纪float score;     //分数char addr[30];   地址为字符串
}student1,student2;

引用结构体变量: student1.age=23;

三、结构体数组

例题:有三个候选人,每个选民只能投票一个人,要求编写一个统计选票程序,先输入被选人的名字,最后输出各人得票结果。

#include <stdio.h>
#include <string.h>struct Person{       // 声明结构体类型char name[20];   //候选人姓名int count;        //候选人得票数
}leader[3] = {"Li",0,"Zhang",0,"Sun",0};   //定义结构体数组并且初始化int main(){int i,j;char leader_name[20];      //定义字符数组for(i=1;i<=10;i++){scanf("%s",leader_name);  //输入所选的候选人姓名for(j=0;j<3;j++){if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}   //strcmp 是比较字符串的意思,字符串不相等则输出0}printf("\nResult:\n");for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);return 0;
}

结果:

Li
Zhang
Sun
Zhang
Li
Zhang
Sun
Zhang
Li
ZhangResult:Li:3
Zhang:5Sun:2

 首先定义了一个全局的结构体数组leader,它有三个元素,每个元素包含两个成员name和count。

再定义数组时使之初始化,将“Li”赋给leader[0].name , 0赋给leader[0].count,"Zhang"赋给leader[1].name , 0赋给leader[1].count。......这三个候选人的票数全部先置0。

所以定义结构体数组的一般形式为:

struct 结构体名{
成员列表
}数组名[数组长度]//还可以:结构体类型  数组名[数组长度];struct Person leader[3];

四、结构体指针

1.指向结构体变量的指针

例题:通过指向结构体变量的指针变量输出结构体变量中成员的信息。

#include <stdio.h>
#include <string.h>int main(){struct Student{long num;char name[20];char sex;float score;}; struct Student stu_1;   //定义struct Student类型变量stu_1 struct Student *p;      //定义指向struct Student类型数据的指针变量p p = &stu_1;             //p指向stu_1 stu_1.num = 10101;     //对结构体变量的成员赋值 strcpy(stu_1.name,"Li Lin");  //用字符串赋值函数给stu_1.name赋值 stu_1.sex= 'M';stu_1.score = 89.5;printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score) ;printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex,(*p).score) ;return 0;
} 

结果:

No.:10101
name:Li Lin
sex:M
score: 89.5

No.:10101
name:Li Lin
sex:M
score: 89.5

分析:将结构体变量stu_1的起始地址赋给指针变量p,也就是使p指向stu_1,然后对stu_1的各个成员赋值。

⚠️:为了方便,(*p).num  可以用p->num 代替

2.指向结构体数组的指针

例题:有三个学生的信息,放在结构体数组里,要求输出全部学生的信息。

#include <stdio.h>struct Student{int num;char name[20];char sex;int age;
};
struct Student stu[3]={
{10101,"Li Lin",'M',18},{10102,"Zhang Fang",'M',19},{10104,"Wang Min",'F',20}
};
int main(){
struct Student *p;
printf(" No.  Name                 sex  age\n");
for(p=stu;p<stu+3;p++)printf("%5d %-20s %2c %4d\n",p->num,p->name,p->sex,p->age)	;return 0;
}

结果:

 No.  Name                 sex  age
10101 Li Lin                M   18
10102 Zhang Fang            M   19
10104 Wang Min              F   20

分析:在for循环里面,首先条件是先让p=stu,也就是stu中序号为0的元素的起始地址,第一次循环输出stu[0]的各个成员的置。然后执行p++,使p自加1。此时p的值就等于stu+1。指向了stu[1]了。

五、用指针处理链表

1.什么是链表?

一种线性数据结构,它由一系列节点(Node)组成,这些节点通过指针(或引用)连接成一个链条。与数组不同,链表的节点在内存中不需要连续存储,数据的逻辑顺序通过节点之间的指针来维持。

链表有一个”头指针“变量,图中是head表示,它存放着一个地址,该地址指向一个元素。链表中每个元素称为”节点“。可以看到head指向第一个元素,第一个元素有指向第二个元素......直到最后一个元素,该元素不在指向其它元素,它称为”表尾“,它的地址部分放一个“NULL”,表示空地址,链表到此结束。

节点至少包含两部分:

数据域:存储具体的数据值(如整数、字符串等)。

指针域:存储下一个节点的内存地址(或引用),用于连接节点。

⚠️:链表中各个元素的地址可以不连续,要找到某个元素,必须找到上一个元素,根据它提供的下一个元素地址才能找到下一个元素。如果不提供“头指针”则整个链表都无法访问。链表如同一条铁链一样。一环扣一环,中间无法断开。

打个比方:幼儿园老师带领孩子出来散步,老师牵着第一个孩子的手,第一个孩子牵着第二个孩子的手,......,最后一个孩子有一只手是空的,他是链尾。

2.建立简单的静态链表

例题:建立一个简单的静态链表,它由3个学生数据的节点组成,要求输出个节点中的数据

#include <stdio.h>// 定义学生结构体
struct Student {int num;         // 学号float score;     // 分数struct Student *next;  // 指向下一个节点的指针
};int main() {// 定义三个学生节点并初始化数据struct Student s1 = {101, 85.5, NULL};struct Student s2 = {102, 90.0, NULL};struct Student s3 = {103, 78.2, NULL};// 建立链表连接关系s1.next = &s2;s2.next = &s3;s3.next = NULL;  // 尾节点指针置为NULL// 定义指针指向头节点struct Student *ptr = &s1;// 使用do-while循环遍历链表并输出数据do {printf("学号: %d, 分数: %.1f\n", ptr->num, ptr->score);ptr = ptr->next;  // 移动到下一个节点} while (ptr != NULL);  // 当指针不为NULL时继续循环return 0;
}

输出结果:

学号: 101, 分数: 85.5
学号: 102, 分数: 90.0
学号: 103, 分数: 78.2

所有节点都是在程序中定义的,不是临时开辟的,也不能用完之后释放,这种链表称为“静态链表”

⚠️:还有很多关于链表的东西,待等到RTOS部分再学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端基础】10、CSS的伪元素(::first-line、::first-letter、::before、::after)【注:极简描述】

一、伪元素的作用 选取某个特定的元素。 二、::first-line、::first-letter ::first-line&#xff1a;针对首行文本设置属性 ::first-letter&#xff1a;针对首字母设置属性 三、::before、::after 在一个元素之前&#xff08;::before&#xff09;或者之后&#xff08;…

系统漏洞扫描服务:维护网络安全的关键与服务原理?

系统漏洞扫描服务是维护网络安全的关键措施&#xff0c;能够迅速发现系统中的潜在风险&#xff0c;有效预防可能的风险和损失。面对网络攻击手段的日益复杂化&#xff0c;这一服务的重要性日益显著。 服务原理 系统漏洞扫描服务犹如一名恪尽职守的安全守护者。它运用各类扫描…

从 Excel 到 Data.olllo:数据分析师的提效之路

背景&#xff1a;Excel 的能力边界 对许多数据分析师而言&#xff0c;Excel 是入门数据处理的第一工具。然而&#xff0c;随着业务数据量的增长&#xff0c;Excel 的一些固有限制逐渐显现&#xff1a; 操作容易出错&#xff0c;难以审计&#xff1b; 打开或操作百万行数据时&…

框架的源码理解——V3中的ref和reactive

最近在研究各个框架的源码&#xff0c;从源码角度去理解 vue3 的 reactive 和 ref API&#xff0c;记录下研究的成果 reactive 首先&#xff0c;reactive() 的参数必须是一个对象&#xff0c;返回值是一个 Proxy 对象&#xff0c;具有响应性。如果参数不是对象类型&#xff0…

能源数字化转型关键引擎:Profinet转Modbus TCP网关驱动设备协同升级

在工业自动化的世界中&#xff0c;ModbusTCP和Profinet是两个非常重要的通讯协议。ModbusTCP以其开放性和易用性&#xff0c;被广泛应用于各种工业设备中&#xff1b;而Profinet则以其高效性和实时性&#xff0c;成为了众多高端设备的首选。然而&#xff0c;由于这两种协议的差…

【ant design】ant-design-vue 4.0实现主题色切换

官网&#xff1a;Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 我图方便&#xff0c;直接在 app.vue 中加入的 <div class"app-content" v-bind:class"appOption.appContentClass"><a-config-provider…

一个指令,让任意 AI 快速生成思维导图

大家好&#xff0c;我是安仔&#xff0c;一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧&#xff0c;让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 &#xff5e; KimiXMind 安仔经常用 XMind 来绘制思维导图&#xff0c;但是 AI 是没…

便捷的批量打印工具推荐

软件介绍 本文介绍的软件是一款批量打印软件&#xff0c;名为PrintConductor。 软件功能强大 这款批量打印软件功能极为强大&#xff0c;它不仅能够批量打印各种不同格式的文件&#xff0c;还可以直接打印整个文件夹。 初次使用设置 第一次打开这款软件时&#xff0c;要记…

USRP 射频信号 采集 回放 系统

USRP 射频信号采集回放系统 也可以叫做&#xff1a; 利用宽带RF录制和回放系统实现6G技术研究超宽带射频信号采集回放系统使用NI USRP平台实现射频信号录制和回放操作演示USRP也能实现多通道宽带信号流盘回放了&#xff01; 对于最简单的实现方法就是使用LabVIEW进行实现 采…

MFC 调用海康相机进行软触发

初始化相机类文件 #pragma once #include "MvCameraControl.h" class CMvCamera { public:CMvCamera();~CMvCamera();//初始化相机int InitCamera();int SaveCurrentImage(CString filePath);//关闭相机void CloseCamera();//设置int SetEnumValue(IN const char* s…

虚拟主播肖像权保护,数字时代的法律博弈

首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下&#xff0c;潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制&#xff0c;运营方惊讶地发现——传统的肖像权保护体系&#xff0c;竟难以完全覆盖这具由代码与数据构成的“…

ArrayList-集合使用

自动扩容&#xff0c;集合的长度可以变化&#xff0c;而数组长度不变&#xff0c;集合更加灵活。 集合只能存引用数据类型&#xff0c;不能直接存基本数据类型&#xff0c;除非包装 ArrayList会拿[]展示数据

鸿蒙ArkUI体验:Hexo博客客户端开发心得

最近部门也在跟进鸿蒙平台的业务开发&#xff0c;自己主要是做 Android 开发&#xff0c;主要使用 Kotlin/Java 语言。&#xff0c;需要对新的开发平台和开发模式进行学习&#xff0c;在业余时间开了个项目练手&#xff0c;做了个基于 Hexo 博客内容开发的App。鸿蒙主要使用Ark…

【和春笋一起学C++】(十四)指针与const

将const用于指针&#xff0c;有两种情况&#xff1a; const int *pt; int * const pt; 目录 1. const int *pt 2. int * const pt 3. 扩展 1. const int *pt 首先看第一种情况&#xff0c;const在int的前面&#xff0c;有如下语句&#xff1a; int peoples12&#xff1…

本地缓存更新方案探索

文章目录 本地缓存更新方案探索1 背景2 方案探索2.1 初始化2.2 实时更新2.2.1 长轮询2.2.1.1 client2.2.2.2 server 本地缓存更新方案探索 1 背景 大家在工作中是否遇到过某些业务数据需要频繁使用&#xff0c;但是数据量不大的情况&#xff0c;一般就是几十条甚至几百条这种…

深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器

requestIdleCallback 核心作用 requestIdleCallback 是浏览器提供的 API&#xff0c;用于将非关键任务延迟到浏览器空闲时段执行&#xff0c;避免阻塞用户交互、动画等关键任务&#xff0c;从而提升页面性能体验。 基本语法 const handle window.requestIdleCallback(callb…

51单片机——交通指示灯控制器设计

设计目标 1、设计一交通灯控制&#xff0c;控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。 2、可手动控制和自动控制&#xff0c;设置两个输入控制开关。 手动/自动开关&#xff0c;通过P11的按键输入控制 3、手动&#xff1a;设置开关P11&#xff0c;两种情况&#x…

神经网络语言模型(前馈神经网络语言模型)

神经网络语言模型 什么是神经网络&#xff1f;神经网络的基本结构是什么&#xff1f;输入层隐藏层输出层 神经网络为什么能解决问题&#xff1f;通用近似定理为什么需要权重和偏置&#xff1f;为什么需要激活函数&#xff1f;权重是如何确定的&#xff1f;1. 穷举2. 反向传播主…

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)

个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的&#xff0c;做计算题要保持头脑清晰&#xff0c;认真读题把PV、…

unordered_map和unordered的介绍和使用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 unordered_map的定义方式 unordered_map接口的使用 unordered_map的容量 unordered_map的迭代器 unordered_map的元素访问 unordered_map的查询 unordered_map的修改操作 unordered_multimap u…