结构体和结构体链表

2023-05-16

       在c语言表针中有多种数据类型,他们的应用使变量的应用变得灵活多变。而除了c语言默认的int ,float ...等类型外,我们还可以自己定义一些数据的类型,结构体类型便是可以实现数据类型自定义的类型。

       结构体是一种类型,他的应用和int,float等变量类型的应用方法一致,切记,结构体是一种类型,不可当作变量进行使用。

       在结构体类型使用时要先进行结构体类型的定义。例如

#include<stdio.h>
struct student
{
	int num;
	char name[20];
	int score[3];
	int aver;
};

       这便是定义了一个结构体类型。结构体的定义必须应用struct关键词,关键词后紧跟着的是结构体名,然后在这个结构体中有四个成员,分别是 整形类型的变量num,字符型数组 name[20],整形数组 score[3], 整形类型变量aver,这就完成了一个结构体类型的定义。此时这个结构体类型是 struct student ,在应用时就以这个结构体类型来定义结构体变量。注意,结构体是类型,不是变量,不能直接应用,要定义一个结构体变量才能应用。换句话说,花了一个图纸不等于盖了一栋房子,图纸还只是图纸,仍旧需要砖瓦来盖大楼。例如

#include<stdio.h>
	struct student
	{
		int num;
		char name[20];
		int age;
		int score;
	};
int main()
{
	struct student student1={0,name,0,0};
	struct student student2={0};
}

       在以上例子中,在main函数中定义了两个结构体变量,分别是 student1 和 student2 ,他们的类型是struct student,这就完成了结构体变量的定义,再定义后可以进行初始化,例子中的花括号中的内容就是初始化的内容。如果只初始化了一部分内容,则剩余的部分的结构体成员均被编译器自动初始化为 0

       既然定义了一个结构体,那么如何应用一个结构体呢?其实结构体变量的应用和我们平常所使用的变量没有太大的区别,只是换了一种访问的方式。例如

#include<stdio.h>
int main()
{
	struct stduent
	{
		int num;
		char name[20];
		int age;
		int score;
	};
	struct student student1 = { 0, name, 0, 0};
	struct student student2 = { 0 };
	printf("Plase input stduent1:\n");
	scanf("%d%s%d%d", &stduent1.num, stduent1.name, &stduent1.age, &stduent1.score);
	printf("Plase input stduent2:\n");
	scanf("%d%s%d%d", &stduent2.num, stduent2.name, &stduent2.age, &stduent2.score);
	if (stduent1.score > stduent2.score)
	{
		printf("stduent1 :\n%d\n%s\n%d\n%d\n", stduent1.num, stduent1.name, stduent1.age, stduent1.score);
	}
	else if (stduent1.score < stduent2.score)
	{
		printf("stduent2 :\n%d\n%s\n%d\n%d\n", stduent2.num, stduent2.name, stduent2.age, stduent2.score);
	}
	else
	{
		printf("stduent1 :\n%d\n%s\n%d\n%d\n", stduent1.num, stduent1.name, stduent1.age, stduent1.score);
		printf("stduent2 :\n%d\n%s\n%d\n%d\n", stduent2.num, stduent2.name, stduent2.age, stduent2.score);
	}
	system("pause");
	return 0;
}

       这便是一个完整结构体应用的代码,目的是输入两个学生的学号,姓名,年龄和成绩,然后比较两个人的成绩,然后输出成绩较高的同学的所有信息。在结构体变量成员的访问中需要用到的运算符是" . "该运算符可以对结构体变量成员进行访问。

       既然结构体是一种类型,那么就一定有结构体指针了。前面说过,结构体是一种类型,他的应用方法和c语言默认的数据类型的应用方法一致,因此,其它类型的的指针如何使用,结构体指针就如何使用。例如,定义一个结构体指针 p,将一个结构体变量的变量名赋给p,则此时p指向的是结构体的首地址,如果对想通过结构体指针p来访问该结构体变量的成员,就需要进行节引用运算。方法如下

       1. (*p). 成员名

       2.    p  ->   成员名

       这两种访问的方式是等价的。

      以上便是结构体的解析。下面介绍链表以及结构体链表。

       链表,顾名思义,即是一条链状的数据。链表是由一个 head 指针变量和许多节点组每个节点有许多元素,最后一个元素是一个指向下一个节点首地址的指针,第一个节点的首地址交给head,末尾的指针指向第二个节点的首地址,以此类推,到达最后一个节点,最后一个节点的末尾指针指向 NULL;这就是一条链表。一条链表必须有一个 head 指针才能寻找到第一个节点,否则无法进行链表的访问,并且每个节点的末尾指针必须指向下一个节点的首地址,否则就无法进行链式访问数据,并且最后一个节点的末尾指针必须指向NULL,避免指针指向未知区域。

       现在我们来创建一个项目,来实现一个链表的创建。首先,先定义一个节点结构体,这个结构体可以存放数据和末尾指针。

struct stduent
{
	long num;
	float score;
	struct stduent * next;
};

       然后在写一个链表创建函数。

#define _CRT_SECURE_NO_WARNINGS 1
#define LEN sizeof(struct stduent)
#include<stdio.h>
#include<stdlib.h>
struct stduent
{
	long num;
	float score;
	struct stduent * next;
};
int n = 0;
struct stduent * creat(void)
{
	struct stduent * head = NULL;
	struct stduent * p1 = NULL;
	struct stduent * p2 = NULL;
	p1 = p2 = (struct stduent*)malloc(LEN);
	printf("请输入索要存储的学生学号和成绩:\n");
	printf("如果需要退出请输入 0 \n");
	printf("学号 成绩\n");
	scanf("%ld,%f", &p1->num, &p1->score);
	while (p1->num != 0)
	{
		n += 1;
		if (n == 1)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
			p2 = p1;
			p1 = (struct stduent *)malloc(LEN);
			printf("学号 成绩\n");
			scanf("%ld,%f", &p1->num, &p1->score);
	}
	p2->next = NULL;
	return head;
}

       这时,一个链表创建函数已经创建完毕。在链表的创建过程中,通过动态内存开辟来实现空间的创建。如果输入的num=0;

就表明链表创建完毕,结束创建。最后,再添加一个main函数就可以实现这个程序的运行了。

#define LEN sizeof(struct stduent)
#include<stdio.h>
#include<stdlib.h>
struct stduent
{
	long num;
	float score;
	struct stduent * next;
};
int n = 0;
struct stduent * creat(void)
{
	struct stduent * head = NULL;
	struct stduent * p1 = NULL;
	struct stduent * p2 = NULL;
	p1 = p2 = (struct stduent*)malloc(LEN);
	printf("请输入索要存储的学生学号和成绩:\n");
	printf("如果需要退出请输入 0 \n");
	printf("学号 成绩\n");
	scanf("%ld,%f", &p1->num, &p1->score);
	while (p1->num != 0)
	{
		n += 1;
		if (n == 1)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
			p2 = p1;
			p1 = (struct stduent *)malloc(LEN);
			printf("学号 成绩\n");
			scanf("%ld,%f", &p1->num, &p1->score);
	}
	p2->next = NULL;
	return head;
}
int main()
{
	struct stduent*pt = NULL;
	pt = creat();
	if (pt!=NULL)
	{
		do
		{
			printf("%-4ld%4.1f\n", pt->num, pt->score);
			pt = pt->next;
		} while (pt != NULL);
	}
	system("pause");
	return 0;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体和结构体链表 的相关文章

  • 串口波形分析

    本文使用逻辑分析仪 xff0c 抓取串口波形 xff0c 进而分析串口数据 串口配置为115200波特率 xff0c 8个数据位 xff0c 1个停止位 xff0c 无校验方式 字符1的波形如下图 xff1a 从图中可以看到8个数据位 xf
  • 电影资源 BT PT下载的电影命名 规则 资源 详解

    初识 一般来说 xff0c 正规压制组压制的电影 xff0c 都采用 0day 命名方式 xff0c 即 xff1a 英文名称 版本说明 年份 片源 分辨率 视频编码 音频格式 压制小组 例如文件名 xff1a Jumanji The Ne
  • 对于51单片机的RAM内存分配(包含栈的分配)

    对于51单片机的RAM内存分配 xff08 包含栈的分配 xff09 我使用的是SH79F3283 xff0c 内部RAM有256字节 xff0c 由常规寄存器 静态存储区和堆栈组成的 xff0c 创建一个新的程序默认占用9个字节RAM x
  • 忘记windows密码解决办法(用户密码或SYSKEY)

    64 TOC 还有朋友问第一层的BIOS密码怎么解 xff1a 拔电池就能解 xff0c 断电 xff0c 打开电脑主板 xff0c 找到一个纽扣电池 xff0c 拔掉 xff0c 长按电源键 xff0c 再插电 xff0c 第一层就没了
  • 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树 Huffman Tree 以及哈夫曼编码的构造原理 方法 xff0c 并用代码实现 1哈夫曼树基本概念 路径 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度 两结点间路径上的分支数 树的路径长
  • Makefile命令参数、调用其他Makefile、嵌套

    更多单片机 嵌入式内容及参考资料 xff1a 大叔的嵌入式小站 xff1a Makefile学习 3 make命令参数 调用其他makefile 嵌套 一 Make命令运行参数 参数 参数的作用 C dir读入指定目录下的makefile
  • ARM学习-ARM指令集详解

    目录 1 ARM 存储器访问指令 1 1 LDR 和STR 加载 存储字和无符号字节指令 1 2 LDM和STM 批量加载 存储指令 1 3 SWP 寄存器和存储器交换指令 2 ARM 数据处理指令 2 1数据传送指令 2 1 1 MOV
  • IIC(I2C)协议详解

    1 简介 IIC 即I C xff0c 全称 Inter Integrated Circuit xff0c 字面上的意思是集成电路之间 xff0c 它其实是I C Bus简称 xff0c 所以中文应该叫 集成电路总线 xff0c 它是一种串
  • STM32F4+FreeRTOS+LVGL实现嵌入式快速开发(缝合怪)

    极速进行项目开发 xff0c 只需要懂一款芯片架构 43 一个操作系统 43 一个GUI 各种部件程序全靠抄 xff0c 成为究极缝合怪 本文用stm32f407 43 FreeRTOS 43 lvgl演示一些demo 原文链接 xff1a
  • 彻底弄清FreeRTOS中的事件组(Event Groups)

    之前已经学过两个任务之间可以利用信号量 队列来通信 xff0c 任务可以利用这两个机制等待某一个事件发生 xff0c 但是假如需要等待多个事件发生呢 xff1f 这就需要用到事件组了 事件组可以让任务进入阻塞态 xff0c 等待一个或多个事
  • 彻底掌握FreeRTOS中的务通知(Task Notifications)

    在之前的文章中已经讲解了很多种用于任务件通信的机制 xff0c 包括队列 事件组和各种不同类型的信号量 使用这些机制都需要创建一个通信对象 事件和数据不会直接发送到接收任务或接收ISR xff0c 而是发送到通信对象 xff08 也就是发送
  • 一文彻底分清ARM架构、内核、指令集等相关概念

    任何学习嵌入式 单片机的朋友都绕不开ARM xff0c 但初学者总是对ARM架构 内核 指令集等相关概念不够清晰或者混淆 xff0c 本文帮助入门的朋友彻底弄清楚 目录 1 芯片 CPU SOC 2 ARM公司 3 ARM架构与内核 指令集
  • 三款常用IP发包工具介绍

    AntPower 版权所有 2003 技术文章 http www antpower org 第1 页共14 页 AntPower xff0d 技术文章 三款常用IP 发包工具介绍 小蚁雄心成员郎国军著 lgj 64 qingdao cngb
  • vscode查看不了函数列表(亲身经历)

    方法一 xff1a ctrl 43 shift 43 o 方法二 xff1a ctrl 43 B 查看左边的大纲 重点 xff1a 当处于受限模式时 xff0c 是查看不了的 xff0c 需要信任窗口才可以 点击管理 点击信任
  • 带你清晰了解#define和宏

    文章目录 define的简单使用 define的原理 define定义宏 define的替换规则 和 define的简单使用 语法 xff1a define name stuff 对于 define的基本语法理解起来其实并不困难 xff0c
  • 玩转Jetson Nano(三):安装Pytorch GPU版

    玩转Jetson Nano xff08 三 xff09 xff1a 安装Pytorch GPU版 前言安装Pytorch GPU版查看CUDA版本号下载Pytorch对应的wheel文件测试是否安装成功常见问题OSError libmpi
  • 可随身携带的工业无人机?! ZR-M66六旋翼多镜头倾斜摄影无人飞行系统

    更多无人机测绘资讯 xff0c 关注 三维前沿 ZR M66六旋翼多镜头倾斜摄影无人飞行系统 xff0c 集合了领先于行业内的多种设计方式 xff0c 具备模块化设计 高效作业 安全可靠 直观作业管理四大核心优势 xff0c 摆脱传统测绘作
  • PLC寻址应注意的问题

    L MD100 LAR1 与 L MD100 LAR1 有什么区别 xff1f 当将MD100以这种 MD100 形式表示时 xff0c 你既要在对MD100赋值时考虑到所赋的值是否符合存储器间接寻址双字指针的规范 xff0c 又要在使用这
  • STL简介以及STL中的容器

    我认为STL 标准模板库 就是对常见数据结构和算法的再封装 xff0c 以便开发者能更加灵活的使用数据结构和常用算法 通常认为 xff0c STL由容器 算法 迭代器 函数对象 适配器 内存分配器 这 6 部分构成 容器 简单理解容器 xf
  • 奇偶校验原理及C实现

    奇偶校验 xff0c 是通过计算数据流中比特位1的个数向原数据流后补充1bit的 0 或 1 xff0c 来检查数据流是否正确的方法 奇校验 xff08 odd parity xff09 xff1a 如果字符数据位中 1 的数目为偶数 xf

随机推荐

  • PHP curl发送 post GET 请求 携带请求头 并接收参数 上传\下载文件或图片

    发送post 请求 64 param sUrl 请求地址 64 param aData 请求参数 64 return bool string function http post sUrl aData ch 61 curl init cur
  • C++ 类对象的初始化顺序

    C 43 43 构造函数调用顺序 1 创建派生类的对象 xff0c 基类的构造函数优先被调用 xff08 也优先于派生类里的成员类 xff09 xff1b 2 如果类里面有成员类 xff0c 成员类的构造函数优先被调用 xff1b 也优先于
  • requests模块中使用代理proxy发送请求

    1 代理概述 玩爬虫为什么我们不能使用一个固定IP发送请求 你使用一个固定IP发送每秒向对方服务器发送10几个请求 对方认为这样操作不是人干的 就把你IP给封了服务器端的人可以根据你IP很快锁定你 要求你对这种窃取行为赔偿 代理 外链图片转
  • FIFO理解

    小白一枚 以下是我在学习SCI通信时 xff0c 使用到FIFO寄存器对其手册进行学习的一些经验与心得 xff0c 为了防止以后使用时忘记 xff0c 故此记录 仅供本人使用 另 xff1a 如有理解不当之处 xff0c 欢迎指正 xff0
  • 使用CMake导入第三方库

    欢迎关注微信公众号 自动驾驶事务所 获取更多知识 欢迎关注公众号 自动驾驶事务所 xff0c 分享更多以C C 43 43 为计算机语言 xff0c 以自动驾驶为方向的文章 使用CMakeLists txt 中间需要导入第三方的库当我们需要
  • 通过onvif协议接入海康、大华NVR步骤

    通过onvif协议接入海康 大华NVR步骤 https wenku baidu com view 6f1fcf37192e45361066f54b html
  • C语言的二维数组初始化的几种方式介绍(私藏大数组初始化方式)

    C语言的二维数组初始化的几种方式介绍 1 直接赋值2 循环对每个元素赋值3 借用memset memset s初始化为0或 14 96 数组所有元素初始化为相同值 xff08 用于大数组初始化贼方便 xff09 96 1 直接赋值 适合数组
  • 怎么用管理员方式打开压缩包

    今天下载了安卓的源代码 xff0c 解压时 xff0c 报了 34 Cannot create symbolic link xxx 34 34 You may need to run WinRAR as administrator 34 的
  • Android的build-tools的下载方式

    Android的build tools的多种版本的下载 1 方式一 xff1a Android Studio上的配置下载2 官网上直接下载 1 方式一 xff1a Android Studio上的配置下载 通过参数 buildToolsVe
  • Visual Studio上一些Error的解决方案

    近期在迁移一个linux上下项目到windows xff0c 编译时出来一堆error xff0c 挑了一些做记录 目录 1 E1696无法打开源文件 unistd h2 E0020 未定义标识符 34 getcwd 34 3 E0020
  • windows下怎么查看exe是32位还是64位

    xxx exe用记事本或notepad打开 xff0c 找有字符的第二行中 PE 字符串旁边 xff0c 如果是 d xff0c 则为64位 xff1b 如果是 L xff0c 则为32位
  • 无法定位程序输入点 _ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1Ev于动态链接库

    在执行编译出来的exe时 xff0c 报了 无法定位程序输入点 ZNSt7 cxx1118basic stringstreamIcSt11char traitsIcESaIcEEC1Ev于动态链接库 的异常 出现这个问题时 xff0c 应该
  • 踩了个C++的未定义标识符"cout"的坑

    问题表现 没怎么用过C 43 43 写过完整的项目 xff0c 今天闲来无事 xff0c 便创建个c 43 43 的工程玩玩 xff0c 结果一个简单的打印输出就给卡住了 xff0c 无法打开文件 iostream h xff0c cout
  • Electron-Vue之安装流程

    近期摒弃了熟悉的WPF xff0c 选用了新的一套工具 xff08 Electron Vue xff09 来开发桌面软件 xff08 我是连html都没用过的猿 xff0c no zuo no die xff09 接触新的东西 xff0c
  • vscode的调试配置

    文章目录 vscode的调试配置文件调试配置选项 vscode的调试配置文件 vscode的调试配置存储在 vscode文件夹的launch json文件中 通过以下步骤可以创建一个调试配置 xff1a 切换到调试视图单击create a
  • C/C++实现strcpy和strcat两个功能

    strcpy和strcat是string h头文件中分别实现字符串数组拷贝与拼接功能的函数 xff0c 详细使用相信大家都了解了 xff0c 如果还不了解看看实例 C C 43 43 笔试必须熟悉掌握的头文件系列 xff08 四 xff09
  • C/C++锁机制(boost)的认知和使用

    锁扩充 加锁的必需考虑三个问题 该锁的不锁 xff0c 将会导致各种莫名其妙的错误 xff1b 加锁范围太大 xff0c 虽然能避免逻辑错误 xff0c 但如果锁了不该锁的东西 xff0c 难免会降低程序的效率 xff1b 加锁方式不合适
  • QT之GPS

    http blog sina com cn s blog 7da13b510100xtgr html 前几天发现手里还闲着一块GPS 佳明的15W 也不知道是好的还是坏的呵呵一时兴起我就趁周六日没什么事情 用qt做了一个界面 现在已经调试完
  • 关于tcp/udp网络调试助手错误提示

    最近在学习网络调试助手与虚拟机中的Ubuntu系统通信 xff0c 在使用Ubuntu做服务器端时 xff0c tcp以及udp协议都遇到了问题 1 tcp协议遇到的问题是 xff1a 网络调试助手提示 xff1a 1035未知错误 xff
  • 结构体和结构体链表

    在c语言表针中有多种数据类型 xff0c 他们的应用使变量的应用变得灵活多变 而除了c语言默认的int xff0c float 等类型外 xff0c 我们还可以自己定义一些数据的类型 xff0c 结构体类型便是可以实现数据类型自定义的类型