结构体变量

news2024/9/29 19:25:24

 

        C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。 在程序中建立一个结构体类型:

1.结构体

建立结构体

struct Student
{	int num;			//学号为整型 
	char name[20];	//姓名为字符串 
	char sex;			//性别为字符型 
	int age;				//年龄为整型
	float score;			//成绩为实型 
	char addr[30];		//地址为字符串 
};						//注意最后有一个分号 

 同时定义变量

struct Student
{	int num;		
	char name[20];
	char sex;	
	int age;
	float score;
	char addr[30];
}student1, student2;

 定义变量

struct Student  student1, student2;

输出变量

#include <stdio.h>
int main()
{	struct Student							//声明结构体类型struct Student
	{	long int num;						//以下4行为结构体的成员
		char name[20];
		char sex;
		char addr[20];
	}a={10101,"Li Lin",'M',"123 Beijing Road"};	//定义结构体变量a并初始化
	printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr);
	return 0;
}

结构体变量的初始化和引用

//结构体变量的初始化和引用
student1.num=10010;
/*已定义了student1为student类型的结构体变量,
则student1.num表示student1变量中的num成员,即student1的num(学号)成员*/

对结构体变量的成员可以像普通变量一样进行各种运算

同类的结构体变量可以互相赋值。

student1=student2;		//假设student1和student2已定义为同类型的结构体变量

例题:输入两个学生的学号、姓名和成绩,输出成绩较高的学生的学号、姓名和成绩。

#include <stdio.h>
int main()
{	struct Student			//声明结构体类型struct Student 
	{	int num;
		char name[20];
		float score;
	}student1,student2;	//定义两个结构体变量student1,student2 
	scanf("%d%s%f",&student1.num,student1.name,&student1.score);	//输入学生1的数据
	scanf("%d%s%f",&student2.num,student2.name,&student2.score);	//输入学生1的数据
	printf("The higher score is:\n");
	if(student1.score>student2.score)
		printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
	else if(student1.score<student2.score)
		printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
	else
	{	printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
		printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
	}
	return 0;
}

2.使用结构体数组

struct 结构体名 {成员表列} 数组名[数组长度];

struct Person
{	char name[20];
	int count;
}
struct Person leader[3];	//leader是结构体数组名 

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

#include <string.h>
#include <stdio.h>
struct Person						//声明结构体类型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++;
	}
	printf("\nResult:\n");
	for(i=0;i<3;i++)
		printf("%5s:%d\n",leader[i].name,leader[i].count);
	return 0;
}

3.结构体指针

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

#include <stdio.h>
#include <string.h>
int main()
{	struct Student			//声明结构体类型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;
}

4.链表

4.1what is "linked list"

        链表有一个“头指针”变量,图中以head表示,它存放一个地址,该地址指向一个元素。 链表中每一个元素称为“结点”,每个结点都应包括两个部分:

 (1) 用户需要用的实际数据;

 (2) 下一个结点的地址。

         head指向第1个元素,第1个元素又指向第2个元素……直到最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

 

struct Student
{	int num;
	float score;
	struct Student *next; 	//next是指针变量,指向结构体变量
}; 

 

4.2建立简单的静态链表

Build a static linked list——"p"

#include <stdio.h>
struct Student						//声明结构体类型struct Student
{	int num;
	float score;
	struct Student*next;
};
int main()
{	struct Student a,b,c,*head,*p;	//定义3个结构体变量a,b,c作为链表的结点
	a.num=10101; a.score=89.5;		//对结点a的num和score成员赋值
	b.num=10103; b.score=90;		//对结点b的num和score成员赋值
	c.num=10107; c.score=85;		//对结点c的num和score成员赋值
	head=&a;					//将结点a的起始地址赋给头指针head
	a.next=&b;					//将结点b的起始地址赋给a结点的next成员
	b.next=&c;					//将结点c的起始地址赋给a结点的next成员
	c.next=NULL;					//c结点的next成员不存放其他结点地址
	p=head;						//使p指向a结点
	do
	{	printf("%ld %5.1f\n",p->num,p->score);	//输出p指向的结点的数据
		p=p->next;				//使p指向下一结点
	}while(p!=NULL);				//输出完c结点后p的值为NULL,循环终止
	return 0;
}

 ->  代表指针指向结点数据

4.3建立简单的动态链表

 

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{	long num;
	float score;
	struct Student*next;
};
int n; 	//n为全局变量,本文件模块中各函数均可使用它
struct Student *creat(void)
//定义函数。此函数返回一个指向链表头的指针
{	struct Student *head;
	struct Student *p1,*p2;
	n=0;
	p1=p2=(struct Student*) malloc(LEN);  //开辟一个新单元
	scanf("%ld,%f",&p1->num,&p1->score);
	//输入第1个学生的学号和成绩
	head=NULL;
	while(p1->num!=0)
	{	n=n+1;
		if(n==1) head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(struct Student*)malloc(LEN);
		//开辟动态存储区,把起始地址赋给p1
		scanf("%ld,%f",&p1->num,&p1->score);
		//输入其他学生的学号和成绩
	}
	p2->next=NULL;
	return(head);
}
int main()
{	struct Student *pt;
	pt=creat(); 	//函数返回链表第一个结点的地址 
	printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);
	//输出第1个结点的成员值
	return 0;
};

4.4 输出链表

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student					//声明结构体类型struct Student
{	long num;
	float score;
	struct Student *next;
};
int n;						//全局变量n
void print(struct Student*head)	//定义print函数 
{	struct Student*p;			//在函数中定义struct Student类型的变量p
	printf("\nNow,These %d records are:\n",n);
	p=head;					//使p指向第1个结点
	if(head!=NULL)			//若不是空表
		do
		{	printf("%ld %5.1f\n",p->num,p->score);	//输出一个结点中的学号与成绩
			p=p->next;		//p指向下一个结点
		}while(p!=NULL);		//当p不是"空地址"
}

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

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

相关文章

基于spring boot +opencv 实现车牌识别、人脸识别、证件识别等功能 附完整代码 毕业设计

界面展示: 这是一个基于spring boot + opencv 实现的项目贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点以学习交流为目的&

装满杯子需要的最短总时长-力扣2335-java双百方案

一、题目描述 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下标从 0 开始、长度为 3 的整数数组 amount &#xff0c;其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水…

用Javascript对二维数组DIY按汉语拼音的排序方法

继续编写“圳品”信息系统&#xff0c;将“圳品”信息读取到JavaScript定义的一个二维数组中进行处理和显示&#xff1a;var p [[100, "都安县丙公司", "产品ab", 5, 25, 10],[50, "南丹县a公司", "产品a", 5, 25, 10],[30, "罗…

力扣sql简单篇练习(十五)

力扣sql简单篇练习(十五) 1 直线上的最近距离 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT min(abs(p1.x-p2.x)) shortest FROM point p1 INNER JOIN point p2 ON p1.x <>p2.x1.3 运行截图 2 只出现一次的最大数字 2.1 题目内容 2…

教你如何用Python分析出选注双色球号码

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 数据集介绍 找从19年到现在的开奖历史数据&#xff0c;我们首先要把这个历史数据拿到&#xff0c; 拿到我们再进行做分析&#xff0c;分析每个号码出现的频率是多少&#xff0c; 哪个多&#x…

Java零基础教程——控制语句

目录程序流程控制顺序结构分支结构if分支语句案例&#xff1a;switch分支案例&#xff1a;循环结构for循环while循环do-while循环跳转控制语句程序流程控制 顺序结构 没什么好说的就是&#xff1a;程序默认执行流程(如下) public class Test {public static void main(String…

spring中bean的生命周期(简单5步)

目录 一、概念 1.生命是bean的生命周期&#xff1f; 2.知道bean生命周期的意义&#xff1f; 3.bean的生命周期按照粗略的五步 二、例子讲解 一、概念 1.生命是bean的生命周期&#xff1f; 答&#xff1a;spring其实就是管理bean对象的工厂&#xff0c;它负责对象的创建&…

[K8S]Kubernetes环境检测与API简介

文章目录环境判断docker环境检测K8S环境检测获取POD的NamespaceAPI Server概述API访问命令行方式编程方式REST API是Kubernetes系统的重要部分&#xff0c;组件之间的所有操作和通信均由API Server处理的REST API调用。环境判断 在使用API时&#xff0c;需要先判断是否是K8S环…

实施ITIL项目的十个参考步骤

ITIL是我们做好IT服务管理流程建设与治理的一个重要知识库&#xff0c;这个知识体系的内容非常丰富&#xff0c;做到全面领会并运用自如是比较困难的。因此&#xff0c;我们提供了这样的一份实施ITIL项目的参考步骤&#xff0c;在新建或治理企业IT管理流程时可以适当借鉴&#…

elasticsearch索引与搜索初步

ES支持cURL交互&#xff0c;使用http请求完成索引和搜索操作&#xff0c;最基本的格式如下&#xff1a;创建索引我们可以使用PUT方法创建索引&#xff0c;通过指定“索引”、“类型”、“文档ID”锁定文档&#xff0c;通过参数指定文档的数据。红色部分的路由分别指定了“索引”…

Homekit智能家居DIY一智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

【博客618】docker容器重启后读写层数据并不丢失的原理

docker容器重启后读写层数据并不丢失的原理 1、场景 当我们对docker容器执行restart后&#xff0c;其实容器中原本读写层里对临时数据还在。只有我们删除了这个容器&#xff0c;重新创建的容器是基于镜像的只读层然后挂载上新的空的读写层&#xff0c;此时临时数据是不在的 2、…

详解指针(2)(初阶版)

前言&#xff1a;内容包括&#xff1a;指针运算&#xff0c;指针和数组&#xff0c;二级指针&#xff0c;指针数组 详解指针&#xff08;1&#xff09;&#xff08;点击即跳转&#xff09; part 1&#xff1a;指针运算 1 指针-整数 以如下代码为例&#xff1a;初始化数组内容…

实验名称:经典同步问题:生成者与消费者问题

实验名称&#xff1a;经典同步问题&#xff1a;生成者与消费者问题 相关知识 信号量 信号量是用来协调不同进程间的数据对象&#xff0c;可用来保护共享资源&#xff0c;也能用来实现进程间及同一进程不同线程间的进程同步。分为二值信号灯和计算信号灯两种类型。 进程与线…

VOC数据增强与调整大小

数据增强是针对数据集图像数量太少所采取的一种方法。 博主在实验过程中&#xff0c;使用自己的数据集时发现其数据量过少&#xff0c;只有280张&#xff0c;因此便想到使用数据增强的方式来获取更多的图像信息。对于图像数据&#xff0c;我们可以采用旋转等操作来获取更多的图…

Android Dalvik虚拟机 堆初始化流程

前言 上篇文章介绍了dalvik虚拟机启动流程&#xff0c;在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中&#xff0c;堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中&#xff…

13 Day:实现内核线程

前言&#xff1a;我们昨天完成了内核的内存池以及内存管理程序&#xff0c;今天我们要揭开操作系统多任务执行的神秘面纱&#xff0c;来了解并实现一个多任务的操作系统。 一&#xff0c;实现内核线程 在聊线程之间我们先聊聊处理器吧&#xff0c;众所周之现在我们的CPU动不动…

心跳太快对身体带来影响?4种方法来减速!

心脏每时每刻都在跳动&#xff0c;跳动时遵循一定的节律。正常情况下成年人每分钟心跳达到60~120下&#xff0c;若心跳每分钟大于120下&#xff0c;被判断为心动过速&#xff1b;若心跳每分钟不足50下&#xff0c;被判断为心动过缓&#xff0c;无论是哪种因素均会影响身体健康。…

详解Redisson分布式限流的实现原理

我们目前在工作中遇到一个性能问题&#xff0c;我们有个定时任务需要处理大量的数据&#xff0c;为了提升吞吐量&#xff0c;所以部署了很多台机器&#xff0c;但这个任务在运行前需要从别的服务那拉取大量的数据&#xff0c;随着数据量的增大&#xff0c;如果同时多台机器并发…

如何用Python打包好exe文件,并替换图标

前言 Python打包&#xff1f;打包exe文件&#xff1f;怎么操作&#xff1f; ok&#xff0c;今天我来分享分享&#xff0c;教你们如何打包号文件&#xff0c;顺便还来展示一下&#xff0c;如何替换好图标 首先把你的代码准备好&#xff0c;尽量不要中文路径&#xff0c;容易报…