版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 8 章 构造数据类型 目的要求1掌握结构体类型;2掌握定义结构体类型变量的方法;3掌握结构体类型变量的引用;4掌握结构体变量的初始化;5掌握结构体数组;6掌握指向结构体类型数据的指针;7,初步掌握链表;8掌握共用体的概念;9掌握枚举类型。基本内容1. 结构体数据;2. 指向结构体类型数据的指针;3. 链表;4. 共用体数据类型;5. 枚举数据类型;6. 用typedef定义类型。重点难点1重点: 结构体数组、指向结构体类型数据的指针。2难点: 链表。课时安排 5学时。 8.1 结构类型与结构变量的定义 C 语言中的结构类型,相当于其它高级语言中的“记录”类型。 8 结构类型定义 struc
2、t 结构类型名 /* struct 是结构类型关键字 */ 数据类型 数据项 1; 数据类型 数据项 2; 数据类型 数据项 ; ; /* 此行分号不能少! */ 案例8.1 定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。 /* 功能:定义一个反映学生基本情况的结构类型 */ struct date /* 日期结构类型:由年、月、日三项组成 */ int year; int month; int day; ; struct std_info /* 学生信息结构类型:由学号、姓名、性别和生日共 4 项组成 */ char no7; char name9; char sex3; st
3、ruct date birthday; ; struct score /* 成绩结构类型:由学号和三门成绩共 4 项组成 */ char no7; int score1; int score2; int score3; ; (1)“结构类型名”和“数据项”的命名规则,与变量名相同。 (2)数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。 例如,本案例代码中的日期结构类型,也可改为如下形式: struct date int year, month, day; ; (3)结构类型中的数据项,既可以是基本数据类型,也允许是另一个已经定义的结构类型。 例如,本案例代码中的结构类型st
4、d_info,其数据项“birthday”就是一个已经定义的日期结构类型date 。 (4)将个数据项称为结构类型的个成员(或分量)。 8 结构变量定义 用户自己定义的结构类型,与系统定义的标准类型(int、char等)一样,可用来定义结构变量的类型。 1. 定义结构变量的方法,可概括为两种: (1)间接定义法先定义结构类型、再定义结构变量 例如,利用案例8.1中定义的学生信息结构类型std_info,定义了一个相应的结构变量 student : struct std_info student; 结构变量student:拥有结构类型的全部成员,其中birthday成员是一个日期结构类型,它又由
5、3个成员构成。 注意:使用间接定义法定义结构变量时,必须同时指定结构类型名。 (2)直接定义法 在定义结构类型的同时,定义结构变量 例如,结构变量 student 的定义可以改为如下形式: struct std_info student; 同时定义结构类型及其结构变量的一般格式如下: struct 结构类型名 结构变量表; 2. 说明 ( 1 )结构类型与结构变量是两个不同的概念,其区别如同 int 类型与 int 型变量的区别一样。 ( 2 )结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。 8.2 结构变量的引用与初始化 案例8.2 利用案例8.1 中定义的结构类
6、型struct std_info,定义一个结构变量 student,用于存储和显示一个学生的基本情况。 #include"struct.h" /* 定义并初始化一个外部结构变量 student */ struct std_info student="000102"," 张三 "," 男 ",1980,9,20; main() printf("No: %sn",student.no); printf("Name: %sn",); printf("
7、;Sex: %sn",student.sex); printf("Birthday: %d-%d-%dn",student.birthday.year, student.birthday.month, student.birthday.day); 程序运行结果: No: 000102 Name: 张三 Sex: 男 Birthday:1980-9-20 1.结构变量的引用规则 对于结构变量,要通过成员运算符“.”,逐个访问其成员,且访问的格式为: 结构变量 . 成员 /* 其中的“.”是成员运算符 */ 例如,案例中的student.no,引用结构变量studen
8、t 中的no成员;引用结构变量student中的name成员,等等。 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为: 结构变量.成员.子成员.最低1级子成员 例如,引用结构变量student中的birthday成员的格式分别为: student.birthday.year student.birthday.month student.birthday.day (1)对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 (2)既可引用结构变量成员的地址,也可引用结构变量的地址。 例如,&stu
9、,&student 。 2. 结构变量的初始化 结构变量初始化的格式,与一维数组相似: 结构变量 = 初值表 不同的是:如果某成员本身又是结构类型,则该成员的初值为一个初值表。 例如,案例8.2 中的student="000102"," 张三 "," 男 ",1980,9,20。 注意:初值的数据类型,应与结构变量中相应成员所要求的一致,否则会出错。 8.3 结构数组 结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。 案例8.3 利用案例8.1中定义的结构类型struct std_info,
10、定义一个结构数组 student,用于存储和显示三个学生的基本情况。 #include"struct.h" /* 定义并初始化一个外部结构数组student3 */ struct std_info student3=“000102”,“ 张三 ”,“ 男 ”,1980,9,20, “000105”,“ 李四 ”,“ 男 ”,1980,8,15, “000112”,“ 王五 ”,“ 女 ”,1980,3,10 ; /* 主函数 main()*/ main() int i; /* 打印表头 : " " 表示 1 个空格字符 */ printf("N
11、o. Name Sex Birthdayn"); /* 输出三个学生的基本情况 */ for(i=0; i<3; i+) printf("%-7s",studenti.no); printf("%-9s",); printf("%-4s",studenti.sex); printf("%d-%d-%dn",studenti.birthday.year, studenti.birthday.month, studenti.birthday.day); 程序运行结果: No.
12、Name Sex Birthday 000102 张三 男 1980-9-20 000105 李四 男 1980-8-15 000112 王五 女 1980-3-10 与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。 与普通数组一样,结构数组也可在定义时进行初始化。初始化的格式为: 结构数组n 初值表 1,初值表 2,.,初值表 n 例如,本案例中的结构数组 student3 。 8.4 指向结构类型数据的指针 结构变量在内存中的起始地址称为结构变量的指针。 8 指向结构变量的指针 案例8.4 使用指向结构变量的指针来访问结构变量的各个成员。 #incl
13、ude“struct.h” struct std_info student=“000102”,“ 张三 ”,“ 男 ”,1980,9,20; main() struct std_info *p_std=&student; printf("No: %sn", p_std->no); printf("Name: %sn", p_std->name); printf("Sex: %sn", p_std->sex); printf("Birthday: %d-%d-%dn", p_std->
14、birthday.year, p_std->birthday.month, p_std->birthday.day); 通过指向结构变量的指针来访问结构变量的成员,与直接使用结构变量的效果一样。一般地说,如果指针变量 pointer 已指向结构变量 var ,则以下三种形式等价: (1)var.成员 (2)pointer->成员 (3)(*pointer).成员 /* “*pointer” 外面的括号不能省! */ 注意:在格式(1)中,分量运算符左侧的运算对象,只能是结构变量;而在格式(2)中,指向运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量,否则都出错
15、。 8 指向结构数组的指针 案例8.5 使用指向结构数组的指针来访问结构数组。 #include"struct.h" /* 定义并初始化一个外部结构数组 student */ struct std_info student3="000102"," 张三 "," 男 ",1980,5,20, "000105"," 李四 "," 男 ",1980,8,15, “000112”,“ 王五 ”,“ 女 ”,1980,3,10 ; main() struct std
16、_info *p_std=student; int i=0; /* 打印表头 */ printf("No. Name Sex Birthdayn"); /* 输出结构数组内容 */ for( ; i<3; i+, p_std+) printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2dn", p_std->birthday.year, p_std->birthday.month, p_std->
17、;birthday.day); 如果指针变量p已指向某结构数组,则p+1指向结构数组的下一个元素,而不是当前元素的下一个成员。 另外,如果指针变量p已经指向一个结构变量(或结构数组),就不能再使之指向结构变量(或结构数组元素)的某一成员。 8 指向结构数据的指针作函数参数 案例8.6用函数调用方式,改写案例8.5:编写一个专门的显示函数display(),通过主函数调用来实现显示。 #include"struct.h" /* 定义并初始化一个外部结构数组 student */ struct std_info student3="000102","
18、; 张三 "," 男 ",1980,5,20, "000105"," 李四 "," 男 ",1980,8,15, “000112”,“ 王五 ”,“ 女 ”,1980,3,10 ; /* 主函数 main()*/ main() void display(); /* 函数说明 */ int i=0; /* 打印表头 */ printf("No. Name Sex Birthdayn"); /* 打印内容 */ for( ; i<3; i+) display( student + i
19、 ); printf("n"); void display(struct std_info *p_std) printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2dn", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); 8.5 链表处理结构指针的应用 8 概述 1.链表结构 链表作为一种常用的、能够实现动态存储分配
20、的数据结构,在数据结构课程中有详细介绍。因为我们大部分同学都没有学过数据结构所以我准备从应用角度,对链表作一简单介绍。(1)头指针变量head指向链表的首结点。 (2)每个结点由2个域组成: 1)数据域存储结点本身的信息。 2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。 2对链表的基本操作 对链表的基本操作有:创建、检索(查找)、插入、删除和修改等。 (1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则
21、称为检索成功;否则,称为检索失败。 (3)插入操作是指,在结点ki-1与ki之间插入一个新的结点k,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化:插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k'成为ki-1的后继、ki的前驱。(4)删除操作是指,删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变化:删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1 成为ki+1的前驱,ki+1成为k i-1的后继。3.语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构。例如: struct grade c
22、har no7; /* 学号 */ int score; /* 成绩 */ struct grade *next; / * 指针域 */ ; 8 创建一个新链表 案例 8.7 编写一个 create() 函数,按照规定的结点结构,创建一个单链表(链表中的结点个数不限)。 基本思路:首先向系统申请一个结点的空间,然后输入结点数据域的(2个)数据项,并将指针域置为空(链尾标志),最后将新结点插入到链表尾。对于链表的第一个结点,还要设置头指针变量。另外,案例代码中的3个指针变量head、new和tail的说明如下: (1)head 头指针变量,指向链表的第一个结点,用作函数返回值。 (2)new 指
23、向新申请的结点。 (3)tail 指向链表的尾结点,用tail->next=new,实现将新申请的结点,插入到链表尾,使之成为新的尾结点。 #define NULL 0 #define LEN sizeof(struct grade) /* 定义结点长度 */ /* 定义结点结构 */ struct grade char no7; /* 学号 */ int score; /* 成绩 */ struct grade *next; / * 指针域 */ ; /*create() 函数 : 创建一个具有头结点的单链表 */ /* 形参:无 */ /* 返回值:返回单链表的头指针 */ stru
24、ct grade *create( void ) struct grade *head=NULL, *new, *tail; int count=0; /* 链表中的结点个数 ( 初值为 0)*/ for( ; ; ) /* 缺省 3 个表达式的 for 语句 */ new=(struct grade *)malloc(LEN); /* 申请一个新结点的空间 */ /*1 、输入结点数据域的各数据项 */ printf("Input the number of student No.%d(6 bytes): ", count+1); scanf("%6s"
25、;, new->no); if(strcmp(new->no,"000000")=0) /* 如果学号为 6 个 0 ,则退出 */ free(new); /* 释放最后申请的结点空间 */ break; /* 结束 for 语句 */ printf("Input the score of the student No.%d: ", count+1); scanf("%d", &new->score); count+; /* 结点个数加 1*/ /*2 、置新结点的指针域为空 */ new->next=NULL; /*3 、将新结点插入到链表尾,并设置新的尾指针 */ if(count=1) head=new; /* 是第一个结点 , 置头指针 */ else tail->next=new; /* 非首结点 , 将新结点插入到链表尾 */ tail=new; /* 设置新的尾结点 */ return(head); 8.6 共用型和枚举型简介 8 共用型 1.概念 使几个不同的变量占用同一段内存空间的结构称为共用型。 2.共用类型的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年肉制品及副产品加工行业发展趋势报告及未来五至十年产业升级与格局演变
- 2026年入团团员考试题库综合试卷及答案详解(各地真题)
- 2026年实验动物饲养员考试及答案
- 医院污水处理自查报告(八)(3篇)
- 沈阳市2026届高考冲刺语文模拟试题含解析
- 中国银行中山分行2027届校园招聘笔试参考题库及答案解析
- 2026年依安县教师招聘考试参考题库及答案解析
- 2026年襄阳四中谷山学校秋季招聘代课教师笔试备考试题及答案解析
- 2026年临猗县教师招聘笔试备考题库及答案解析
- 2026年政和县教师招聘考试备考题库及答案解析
- 第四单元 第1课时 青蛙歌(教学设计)数学北师大版五年级上册2026秋
- 2026高考英语【全国二卷】试卷及参考答案(含听力音频、听力原文)
- 2026年上海松江国有资产投资经营管理集团有限公司招聘笔试参考题库附带答案详解
- 语文试卷(26-65C)答案重庆市金太阳好教育联盟2026届高三10月联考(26-65C)
- 【《某变电站(220kV110kV10kV)短路电流的计算过程案例》3000字】
- 农业技术交流会
- 2025年一级造价师水利案例真题及答案解析
- 军人压力调节课件
- 航天煤油标准
- 六年级英语完形填空100篇(含答案及讲解)
- 《影视鉴赏(第2版)》课件全套 张婉宜 第1-5章 影视鉴赏基础- 欧洲及其他地区影视鉴赏
评论
0/150
提交评论