第14章-结构与抽象数据类型_第1页
第14章-结构与抽象数据类型_第2页
第14章-结构与抽象数据类型_第3页
第14章-结构与抽象数据类型_第4页
第14章-结构与抽象数据类型_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第14章 结构与抽象数据类型,学习目标 (1)理解结构的概念,掌握结构的定义和访问方法。 (2)熟悉结构作为函数参数的使用方法。 (3)理解自引用指针的概念,理解利用自引用指针建 立线性链表的方法。 (4)理解联合的概念,能使用联合解决简单的实际问题 (5)理解并掌握位运算,了解位字段的概念和使用。,基本类型整型、实型、字符型等。 构造类型数组,数组中的各元素属于同一类型。 当若干个不同类型的数据项组成一个组合项时,用什么 数据结构? 例如:一个学生的学号,姓名,姓别,年龄,地址等。 C语言中提供了一种实现这种组合的数据结构- -结构体类型,14.1结构体类型的定义和使用,14.1.1 结构体

2、类型的定义 结构体类型的定义的一般形式: struct 结构体名 成员表列 ;,结构体内的各个成员(即分量)对每个成员都应进行类型说明,员的命名和类型说明与变量相同。,例如: 将一个学生的学号、姓名、年龄、成绩、地址等项定义成一个结构体类型,struct student int num; char name20; char sex ; int age; float score; char addr30; ;,结构体名的取法与变量名相同,分号,成员列表(称为域表),这个定义就表示定义了一种类型名为struct student 的结构体类型,struct 是系统关键字,表示开始定义一个结构体类型,

3、 经过上面的定义, 类型名 struct student 就可以和其它类型(如 int 等) 一样用来作为定义变量的类型,num name sex age score addr,10010 Li Fun M 18 87.5 Beijng,a,1. 先定义结构体类型再定义变量名, 例如:,struct student int num; char name20; char sex ; int age; float score; char addr30; ; struct student student1, student2;,定义结构体类型 struct student,定义了两个结构体类型 的变

4、量student1和student2,student1 10001 Zhang Xin M 19 90.5 Shanghai,student2 10002 Wang Li F 20 98 Beijing,各占 59 个字节,14.1.2 定义结构体类型变量的方法,定义结构体类型的变量时,必须指定具体的结构 体类型名。 结构体类型名不是变量,上例中:student 2. 可以用宏定义来定义一个符号常量代表一个结构体类型, 目的是为了使用方便。 3. 对于较大的程序,往往将结构体类型的定义集中放到一个文件中,然后在需要用到该结构体类型的源程序中用#include 命令包含进来。,注 意,2. 在定

5、义类型的同时定义变量,一般形式为:,定义了两个类型为struct student的变量student1和student2,struct student int num; char name20; char sex ; int age; float score; char addr30; student1, student2;,注意;的位置,struct 结构体名 成员表列 变量名表列 ;,3. 直接定义结构类型的变量(无结构体名),这里不出现结构体名!,struct 成员表列 变量名表列 ;,一般形式为:,1. 注意“类型”与“变量”区分。 2. 结构体中的成员(即“域”)可以单独使用,作用和

6、地 位相当于普通变量。 3. 结构体中的成员还可以是另一个结构体变量。,结 构 体 类 型 的 说 明,struct date int month; int day; int year; ;,定义一个结构体类型 struct date,struct studen int num; char name20; int age ; float score; struct date birthday; char addr30; student1, student2 ;,定义结构体类型 struct student,struct date类型的变量birthday,定义了两个具有struct stude

7、nt类型的变量student1和student2,例 如 :,4. 成员名可以和程序中的其它变量名相同,两者互不干涉。,num name sex age,birthday,month day year,addr,struct student,struct day,student1 student2,存储形式:,在定义了结构体变量以后,就可以引用这个变量以及变量中的各个成员。 (1) 结构体变量中的成员的引用方式: 结构体变量名 . 成员名 结构体变量的成员变量的用法和一般变量一样。 如: 被赋值 , 参与运算,. student1 . num=10010 ; 表示变量 student1 中的成

8、员 num赋于10010值。,“.” 成员(分量)运算符级别最高,14.1.3 结构体类型变量的引用,(2) 如果结构体变量的成员本身又属于一个结构体类型,则需要用若干个成员运算符逐级找到最低一级的成员。如 : student1 . birthday . year,新标准C语言允许将一个结构体变量直接赋值给另一个相同类型的结构体变量。 例如: student2=student1 ; 把 student1中所有成员的值一 一赋给 student2 中相应的成员.,注意,只能对最低一级的成员进行赋值、存取以及运算.,(4) 可以引用成员的地址,也可以引用结构体变量的地址,如 : 以八进制 输出 s

9、tudent1的地址,(3) 结构体变量的成员变量可以像普通变量一样进行各种运算, 例如:,student1 . score=student2 . score ; sum=student1 . score+student2 . score ; student1 . age+ ; +student1 . age ;,( 5)不能用以下语句整体输入结构体变量,如 : scanf(%d , %s , %c , %d , %f , %s , ,结构体数组中的每个元素都是一个结构体类型的数据, 而且都分别包括各个成员项。,struct student int num; char name20; char

10、 sex ; int age; float score; char addr30; ; struct student stu3;,定义了一个数组stu3,其各元素 为 struct student 类型的数据,定义结构体类型 struct student,14.2 结构体数组,类似于结构体变量的定义,只需将变量改为数组,例如:,14.2.1 定义结构体数组,也可以直接定义:,struct student 或: struct . . stu3; stu3;,num name sex age score address,stu 0 10101 Li Lin M 18 87.5 103 Beijin

11、g Road,stu1 10102 Zhang Fun M 19 99 130 Shanghai Road,stu2 10104 Wang Min F 20 78.5 1010 Zhongshan Road,数组各元素在内存中连续存放:,内存中是连续存放的:,stu0,10101 2个字节,Li Lin 20个字节,M 1个字节,18 2个字节,87.5 4个字节,103 Beijing Road 30个字节,59 个字节,stu1,stu2,。 。 。 。 。 。,只需在定义数组时在数组名后面加上 =初值表列; 例如:,1. 元素内部按成员顺序初始化; 2. 按数组元素顺序,每个元素可用 括

12、起来;,14.2.2 结构体数组的初始化,struct student int num; char name20; stu3= 97001,Zhang,97002,Li,97003,Wang ;,3. 元素个数,如果缺省,按初值个数来确定,例如:,struct student int num ; char name20 ; stu = 97001,Zhang,97002,Li,97003,Wang ;,也可以另外定义和初始化 struct student stu =97001,Zhang,97002,Li,97003,Wang ;,#include struct person char nam

13、e20; int count; leader3= Li,0,Zhang,0,Wang,0 ;,有三个候选人,统计得票次数。 (设有10个人选),leader3,name count,Li 0,Zhang 0,Fun 0,14.2.3 结构体数组应用举例,例 14.2,void main( ) int i , j; char leader_name20; for (i=1; i=10 ; i+) /* 执行10次 */ scanf(%s, leader_name); for (j=0 ; j3 ; j+) if (strcmp(leader_name , )=0) lea

14、derj . count+ ; /* 注意优先级 */ printf(n); for (i=0 ; i3 ; i+) printf(%s : %dn,leaderi . name , leaderi . count); ,14.3.1 指向结构体变量的指针,#include void main( ) struct student long int num; char name20; float score; ; struct student stu; struct student *p; p=,/* 定义结构体变量 stu */,/* 定义指向 struct student 型数据的指针变量

15、p */,/* p指向stu的起始地址 */,/* 变量成员赋值 */,例 14.3,14.3 指向结构体类型数据的指针,为了使用方便,将指针p所指向的结构体变量中的成员表示为: p-成员名 等价于: (*p).成员名 - 称为指向运算符。也就是说有三种形式:,注意: (*p ) . num不可省( ),因为 . 的优先级最高 (*p) 表示 p 所指向的结构体变量,一个结构体变量的指针就是指向一个结构变量所占据的内存段的起始地址。,(1)结构体变量名 .成员名 stu . num (2) (* p) . 成员名 (若 p= . ; struct student stu3; struct st

16、udent *p;,14.4.2 指向结构体数组的指针,(1) p+1 表示下一个数组元素的起始地址,即 表示令 p 指向结构体数组 stu 的首地址,则,14. 5 共用体,共用体类型的结构:几个不同类型的变量共占同一段内存的结构。,共用体类型变量的定义:,union 共用体类型名 成员表列 ; union 共用体类型名 变量表列 ;,union 共用体类型名 成员表列 变量表列 ;,union 成员表列 变量表列 ;,14.5.1 共用体的概念,共用体变量所占的内存长度等于最长的成员的长度。,例如:,union data int i ; char ch ; float x ; a ;,变量 a 占几个 字节?,i , ch , x,想一想,a,14.5.2 共用体变量的引用,只能引用共用体变量中的成员,引用方式: 共用体变量名 . 成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论