




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第11章 结构体和共用体,青岛农业大学理信学院,主要内容,一、结构体与结构体数组 二、共用体 三、枚举类型 四、typedef定义类型,青岛农业大学理信学院,一、结构体,例子:表示一个学生的信息,比如学号、姓名、性别、年龄等。 分别定义普通变量int num; char *name; char sex; int age; 无法反应出这些变量的内在联系。 构造类型的数据结构数组? 结构体就是用于表示上述结构的数据结构。,青岛农业大学理信学院,struct student int num; char *name; char sex; int age; ;,关键字,表示以下 定义一个结构体,结构体类
2、型的 名字,结构体的成员。 定义方式与普通变量类似,强调:student 是一种类型,跟int,char,float等基本类型 同等地位!,青岛农业大学理信学院,声明结构体类型的一般形式,struct 结构体名 成员1; 成员2; ;,青岛农业大学理信学院,定义student类型的变量(1),struct student stu1,stu2; 先声明结构体类型再定义变量,青岛农业大学理信学院,定义student类型的变量(2)在声明类型的同时定义变量,struct student int num; char *name; char sex; int age; stu1,stu2;,一般形式:
3、struct结构体名 成员表列 变量名表列;,青岛农业大学理信学院,定义student类型的变量(3)直接定义结构体类型变量,struct int num; char *name; char sex; int age; stu1,stu2;,一般形式: struct 成员表列 变量名表列;,青岛农业大学理信学院,例子:结构体变量的使用,include “stdio.h” void main() struct student long int num; char *name; char sex; int age; stu1=10101,”Li Lin”,M,21; printf(“No:%ldn
4、”,stu1.num); printf(“Name:%sn”,); printf(“Sex:%cn”,stu1.sex); printf(“Age:%dn”,stu1.age); ,青岛农业大学理信学院,结构体成员的引用,结构体变量名.成员名 其使用跟普通变量相同,结构体变量的初始化,定义时初始化: Struct Student stu1=10101,”LiLin”,M,19; 直接赋值: stu1.num=10101;,结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有 10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。
5、 结构体数组与以前介绍过的数值型数组不同之处在于,每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。,结构体数组定义,struct student int num; char name20; char sex; int age; float score; ; struct student stu3;,青岛农业大学理信学院,结构体数组例子,例11.2 对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include #include struct person char name20;int count; ;leader3=
6、“Li”,0, “ Zhang”,0, “ Fun”,0,void main() int i,j; char leader_name20; for (i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if (strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(“%s:%dn”,,leaderi.count);,指向结构体类型的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。 可以设一个指针变量,用来指向一个
7、结构体变量,此时该指针变量的值是结构体变量的起始地址。,例子,stuct student stu; struct student *p= 其中, -称为指向运算符,以下三种形式等价:,结构体变量.成员名 (*p).成员名 p-成员名,指向结构体数组的指针,指针变量也可以用来指向结构体数组中的元素。 struct student stu3,*p; p=stu;或者p=p+) printf(“%d %s %c %d”,p-num,p-name,p-sex,p-age),链表动态存储结构,存储学生信息:结构数组 缺点:长度需要足够大,以便能够存放任何班级的学生数据,会造成内存空间的浪费,1356,1
8、475,1021,1249,1249,head,链表结点的结构,struct node char ch; struct node *next; ,生成链表,struct node a,b,c,d,*head; a.ch=A;b.ch=B;c.ch=C;d.ch=D; head=,访问链表,struct node *p; p=head; while(p!=NULL) printf(“%c”,p-ch); p=p-next; ,动态链表:根据需要创建结点,动态分配结点的存储单元 malloc calloc free,(1)malloc函数,其函数原型为void *malloc(unsigned i
9、nt size); 其作用是在内存的动态存储区中分配一个长度为size的连续空间。 此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。,(2) calloc函数,其函数原型为void *calloc(unsigned n, unsigned size); 其作用是在内存的动态存储区中分配个长度为size的连续空间。 函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。 用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为Size。,注意malloc和c
10、alloc返回的指针都是void指针,使用时需要强制类型转换。,(3) free函数,其函数原型为void free(void *p); 其作用是释放由指向的内存区,使这部分内存区能被其他变量使用。是最近一次调用calloc或malloc函数时返回的值。 free函数无返回值。,实例:链表动态生成,青岛农业大学理信学院,二、共用体,union data union data int i; int i; char ch; 或 char ch; float f; float f; a,b; ; union data a,b;,青岛农业大学理信学院,共用体类型变量,特点:成员共享同一段内存,即从同一
11、地址开始。 在某一确定时刻,只有一个成员可用。,1000,青岛农业大学理信学院,例子,#include stdio.h void main() union data int i; char c; float f; a; a.i=10; a.c=a; a.f=1.2; printf(%dn,a.i); printf(%cn,a.c); printf(%fn,a.f); ,例11.12 使用一个结构表示教师和学生。,#include struct int num; char name10; char sex; char job; union int banji; char position10;
12、category; person2;/*先设人数为2*/,11.8 共用体,void main() int i; for(i=0;i2;i+) scanf(%d %s %c %c, ,运行情况如下: ,青岛农业大学理信学院,三、枚举类型,enum weekdaysun,mon,tre,wed,thu,fri,sat; enum weekday workday,weekend; 或者 enum weekdaysun,mon,tre,wed,thu,fri,sat workday;,枚举元素 或者枚举常量,青岛农业大学理信学院,枚举类型变量的使用,workday=mon;,青岛农业大学理信学院,注
13、意1,枚举元素在C编译器中是按常量处理的,不是变量。 Mon=1; 错!,青岛农业大学理信学院,注意2,枚举元素是有值的,按照定义的顺序分别是0,1,2, workday=mon; 该变量的值应为1。 enum weekday sun=7,mon,tre,wed,thu,fri,sat;,青岛农业大学理信学院,注意3,枚举元素可以按照其数值的大小用作判断和比较 If (workday=mon),青岛农业大学理信学院,注意3,整数不能直接赋值给一个枚举变量,需要强制类型转换 workday=(enum weekday)2;,青岛农业大学理信学院,例11.13:五种颜色的球,从中取颜色不一样的三个
14、球的排列组合,并输出。,#include main() enum color red,yellow,blue,white,black; enum color i,j,k,pri; int n,loop;n=0; for (i=red;i=black;i+) for (j=red;j=black;j+) if (i!=j) for (k=red;k=black;k+) if (k!=i) ,switch (pri) case red:printf(%-10s,red); break; case yellow: printf(%-10s,yellow); break; case blue: pri
15、ntf(%-10s,blue); break; case white: printf(%-10s,white); break; case black: printf(%-10s,black); break; default :break; printf(n); printf(ntotal:%5dn,n); ,使用枚举常量使得程序更加直观。 其实直接使用0,1,2分别代表红,黄,蓝也是可以的。,四、typedef定义类型,用typedef可以定义新的类型名来代替已有的类型名。 定义INTEGER为整型 typedef int INTEGER; 定义结构类型 Typedef struct int month; int day; int year;DATE;,说明,(1)用typedef可以声明各种类型名,但不能用 来定义变量。 (2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。 (3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商场卫生安全教育培训课件
- 2025年电子商务行业社交电商发展前景研究报告
- 南京市2025江苏南京仲裁委员会办公室招聘1人笔试历年参考题库附带答案详解
- 2025长航货运有限公司芜湖分公司招聘3人(二安徽)笔试参考题库附带答案详解
- 2025福建漳州市芗江人力资源服务有限公司招聘4人笔试参考题库附带答案详解
- 2025湖北神农架国有资本投资运营(集团)有限公司招聘12人笔试参考题库附带答案详解
- 2025广东佛山市三水海江昇平建设工程有限公司招聘企业工作人员27人(第一批)笔试参考题库附带答案详解
- 2025年福建省高速技术咨询有限公司招聘75人笔试参考题库附带答案详解
- 2025年宣城广德经济开发区投资开发集团有限公司招聘25人笔试参考题库附带答案详解
- 2025年合肥东新融媒科技有限公司招聘5人笔试参考题库附带答案详解
- 村干部饮水安全培训总结课件
- 安全生产治本攻坚三年行动半年工作总结
- 单招备考科学方案
- 《工程勘察设计收费标准》(2002年修订本)
- 隧道开挖施工讲解课件
- 第三单元名著导读《朝花夕拾之二十四孝图》-部编版语文七年级上册
- 最新人教版四年级英语上册课件(完美版)Review of Unit 5
- 掌骨骨折查房课件
- 大学食堂装饰装修方案
- 工资结清证明(模板)
- 矿山档案(台帐) 表格参照模板参考范本
评论
0/150
提交评论