版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Xuan shanli第七章第七章 结构与联合结构与联合第七章第七章 结构与联合结构与联合构造类型二构造类型二Xuan shanli第七章第七章 结构与联合结构与联合结构与联合的概念结构与联合的概念 在数据中,经常有一些既有联系,类型又不同的数据,并且它在数据中,经常有一些既有联系,类型又不同的数据,并且它们之间又有一定的相关性,需要一起处理。们之间又有一定的相关性,需要一起处理。如:学生基本档案的数据如:学生基本档案的数据 字段:字段: 学号学号 姓名姓名 性别性别 地址地址 分数分数类型:类型: long char char char float C语言允许用户按自己的需要将不同的基本类型
2、构造成一种特语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型,即殊类型,即结构和联合。结构和联合。结构和联合的操作分为三个步骤:结构和联合的操作分为三个步骤:根据需要定义结构或联合类型;根据需要定义结构或联合类型;通过定义的类型说明变量、数组、指针;通过定义的类型说明变量、数组、指针;引用变量、数组元素和指针指向的对象。引用变量、数组元素和指针指向的对象。Xuan shanli第七章第七章 结构与联合结构与联合7.1 结结 构构 结构类型的定义结构类型的定义格式:格式: struct 结构名结构名 type 成员项成员项1 ; type 成员成员项项2 ; type 成员成员项项n
3、; ;结构标志。结构标志。用标识符命名的结构类型名。用标识符命名的结构类型名。 结构类型中所含结构类型中所含的成员项及其类型。的成员项及其类型。struct student long num ; char name20 ; int age ; char add30 ; float score ; ;结构的定义确定了如下两点:结构的定义确定了如下两点:定义结构类型,确定结构中的成员项的名称及类型。定义结构类型,确定结构中的成员项的名称及类型。 指明该结构类型的变量在内存中的组织形式。指明该结构类型的变量在内存中的组织形式。Xuan shanli第七章第七章 结构与联合结构与联合结构变量的说明结构
4、变量的说明 定义结构只是确定该结构类型的名称及其成员项的组成及成员定义结构只是确定该结构类型的名称及其成员项的组成及成员项的类型。必须由定义的结构类型说明结构变量,才开辟相应的内项的类型。必须由定义的结构类型说明结构变量,才开辟相应的内存空间以供使用。存空间以供使用。结构变量的说明方式:结构变量的说明方式:定义后说明定义后说明 struct student long num ; char name20 ; int age ; char add30 ; float score ; ;struct student wang,zhang,liu;用用struct student 类型说明三个变量。类
5、型说明三个变量。定义结构类型时说明变量定义结构类型时说明变量 wang,zhang,liu;Xuan shanli第七章第七章 结构与联合结构与联合无名结构方式说明变量无名结构方式说明变量struct long num ; char name20 ; int age ; char add30 ; float score ; wang,zhang,liu;说明:说明: 注意类型和变量的区别。注意类型和变量的区别。成员项可单独使用。成员项可单独使用。wang.age=20结构的成员项也可以是结构变量。结构的成员项也可以是结构变量。struct doc char name20 ; struct bi
6、rth age ; float sal ; ;struct birth int year; int mon; int day; ; 结构结构doc中的成中的成员项是一个员项是一个birth的的结构变量!结构变量! Xuan shanli第七章第七章 结构与联合结构与联合结构变量的引用结构变量的引用 结构变量都是以成员项作为引用单位结构变量都是以成员项作为引用单位, ,引用方式:引用方式: 结构变量名结构变量名.成员项名成员项名wang.score=100;说明:说明:结构变量的成员项与普通变量有相同的性质。结构变量的成员项与普通变量有相同的性质。结构变量可以相互赋值,如:结构变量可以相互赋值,
7、如: zhang = wang; 则则wang的所有成员项的值赋给了的所有成员项的值赋给了zhang的对应成员项。的对应成员项。结构体变量的初始化结构体变量的初始化结构变量可以在说明时赋初值,称为初始化。结构变量可以在说明时赋初值,称为初始化。struct student long num ; char name20; int age ; float score ; char addr 30 ; wang=99010101 , “王五王五” , 20 , 90.5 , “上海上海” ,zhang;Xuan shanli第七章第七章 结构与联合结构与联合结构数组结构数组 结构变量也可以结构变量也
8、可以构造成数组,构造成数组,称为称为结构数组结构数组。每个数组元素都。每个数组元素都是一个结构变量,都含有结构成员项。它们在内存中的地址是连续是一个结构变量,都含有结构成员项。它们在内存中的地址是连续的。的。数组的说明:数组的说明: struct 结构名结构名 结构数组名结构数组名 常量表达式常量表达式 ;struct student long num ; char name20 ; float score ; stud3 ;说明:说明: 三个结构数组元素都含有三个结构数组元素都含有student 的成员项。的成员项。结构数组名结构数组名stud,代表结构数组的首地址。,代表结构数组的首地址。
9、 外部和静态结构数组在说明时可以初始化。外部和静态结构数组在说明时可以初始化。 =99010101 , “Wang” ,67.5 , 99010102 , “Zhao” ,78.5 , 99010103 , “Fang” , 98.5 ;Xuan shanli第七章第七章 结构与联合结构与联合举例:统计三个候选人的票举例:统计三个候选人的票.数。数。#include #define NUMBER 10struct student int num ; char name20 ; int count ; lead3 = 1 , “Zhang” ,0, 2 ,“Tan” ,0 , 3 , “Wang
10、” , 0 ;void main (void) int i ,j ,numb ; for (i=0 ; iNUMBER ; i+ ) scanf (“%d” ,&numb ) ; if (numb0) leadnumb-1 .count + ; else printf(“Selection errorn”); printf (“ n ” ) ;for (i=0 ; i成员项名成员项名结构指针主要用于对结构数组操作。结构指针主要用于对结构数组操作。struct studoc int iNum; char *name;*p,wang=2001,”wang li”;p=&wang;p
11、rintf(“%d:%s”,p-iNum,p-name;Xuan shanli第七章第七章 结构与联合结构与联合举例:举例:#include struct sam int num ; char name20 ; char addr30; ws = 101 , “Fang” , “Shanghai” , 102 , “Tan” , “Bejing” , 103 , “Wang” , “Hefei” ;void main ( void) int i; struct sam *pws ; pws = ws ; for ( i=0 ; inum , pws-name , pws-addr ) ; 定义
12、结构,说明定义结构,说明数组并初始化。数组并初始化。说明结构指针。说明结构指针。指针指向结构数组。指针指向结构数组。通过指针引用成通过指针引用成员项。员项。Xuan shanli第七章第七章 结构与联合结构与联合结构与函数参数结构与函数参数 当函数需要通过形参传递一个结构时,一般有两种处理办法:当函数需要通过形参传递一个结构时,一般有两种处理办法: 传递一个结构指针(效率高)。传递一个结构指针(效率高)。#includevoid mprintp (struct student * ) ;struct student long num ;char *name ;float score; ; vo
13、id main ( ) struct student s1 ; s1.num = 99010101 ; = “wang hai” ; s1.score = 99 ; mprintp ( &s1 ) ; void mprintp ( struct student *sp ) printf(“%ldn%sn%5.1fn” , sp-num , sp-name , sp-score ) ;指向结构的指针。指向结构的指针。传递一个结构变量(效率低)。传递一个结构变量(效率低)。 void mprintp (struct student ) ; s1struct student
14、svsv.num, , sv.score 结构变量。结构变量。Xuan shanli第七章第七章 结构与联合结构与联合返回结构变量的函数返回结构变量的函数 当函数的返回值为一个结构变量时,称该函数为一个结构型函当函数的返回值为一个结构变量时,称该函数为一个结构型函数。数。struct stu sv(void) struct stu t; return t; 函数的类型,即返回值是函数的类型,即返回值是结构变量。结构变量。Xuan shanli第七章第七章 结构与联合结构与联合例例题题返返回回结结构构的的函函数数#includestruct stu long num ; char
15、name10 ; float score ; ; struct stu sv(void);void main ( void)struct stu ws ; ws = sv ( ) ; printf (“%ldn%sn:%fn” , ws.num , , ws.score ) ;struct stu sv(void) struct stu stemp ; char str20; gets() ; gets(str); stemp.num=atol(str); gets(str); stemp.score=atof(str); return ( stemp) ;
16、Xuan shanli第七章第七章 结构与联合结构与联合返回结构指针的函数返回结构指针的函数 当函数的返回值为一个结构指针时,称该函数为一个结构指针当函数的返回值为一个结构指针时,称该函数为一个结构指针型函数。型函数。#includestruct stu long num ;char *name;float score ; sa = 99010101 , “fun” , 89, 99010102 , “zhang” , 99 , 99010103 , “wang” ,78 , 0 , 0 , 0struct stu *findp (long) ;void main ( )long lsanum
17、 ; int i ; struct stu *sap ; printf (“Enter the number:” ) ; scanf (“%ld” , &lsanum ) ; sap = findp (lsanum ) ; if ( sap -num = NULL ) printf ( “not found n ” ) ;else printf (“%ld n %s n %f n ” , sap-num , sap-name ,sap-score) ;struct stu *findp (long number ) struct stu *p = NULL; int i ; for (
18、i=0 ; sa i .num !=0 ; i+ ) if (sa i .num = number ) p = &sai; break ; return p ;Xuan shanli第七章第七章 结构与联合结构与联合思考题思考题 已知一个班有已知一个班有40个人,本学期有两门课程的成绩,个人,本学期有两门课程的成绩,求:求: 所有课程中的最高成绩,及对应的姓名、学号和课程编号。所有课程中的最高成绩,及对应的姓名、学号和课程编号。 课程课程1,2的平均成绩,并求出两门课程都低于平均成绩的学的平均成绩,并求出两门课程都低于平均成绩的学生姓名和学号。生姓名和学号。 对编号对编号1的课程从高到
19、低排序。(注意,其他成员项应保持的课程从高到低排序。(注意,其他成员项应保持对应关系)。对应关系)。 说明:要求定义结构,第一成员项为学生姓名,第二成员项为说明:要求定义结构,第一成员项为学生姓名,第二成员项为学号,另外两个成员项为两门课成绩。学号,另外两个成员项为两门课成绩。、要求分别用函数要求分别用函数完成。完成。Xuan shanli第七章第七章 结构与联合结构与联合7.2 链链 表表 引用自身的结构和链表的概念引用自身的结构和链表的概念 结构中的某个成员项,为指向该结构类型自身的指针,则称为结构中的某个成员项,为指向该结构类型自身的指针,则称为引用自身的结构。引用自身的结构。 stru
20、ct student int num ; float score ; char *name ; struct student *next ; ;指向自身的结构。指向自身的结构。相同类型的结构指针。相同类型的结构指针。 链表链表是一种动态存储分配结构,通过指针相连,数据可以不连是一种动态存储分配结构,通过指针相连,数据可以不连续存放。续存放。head结构变量结构变量NULLXuan shanli第七章第七章 结构与联合结构与联合链表链表head2000H2000H2400H2400HNULLtailXuan shanli第七章第七章 结构与联合结构与联合内存分配函数内存分配函数 链表的操作需要开
21、辟内存单元以便插入或追加节点,删除节点链表的操作需要开辟内存单元以便插入或追加节点,删除节点后需要释放节点占用的内存单元。后需要释放节点占用的内存单元。C 语言提供了相应的函数。语言提供了相应的函数。malloc函数函数使用方法:使用方法: ptr=malloc(size);分配内存的字节数。分配内存的字节数。返回空类型的指针。返回空类型的指针。成功:返回内存的地址。成功:返回内存的地址。失败:返回失败:返回NULL。void *ptr;ptr=malloc(sizeof (int) )ptrvoid free(ptr) 作用:作用: 释放释放ptr指向的由指向的由malloc分配的内存空间。
22、分配的内存空间。Xuan shanli第七章第七章 结构与联合结构与联合链表的操作链表的操作建立链表建立链表步骤:步骤:定义引用自身的结构。定义引用自身的结构。说明指向结构的指针,说明指向结构的指针,head(头指针头指针),tail(尾指针)。尾指针)。#iinclude #include struct slist char info ; struct slist *nextp ; ;void main ( void) struct slist *head , *tail , *find ; char c , d ; head=tail=(struct slist *) malloc (si
23、zeof ( struct slist ) ; head-nextp = NULL ;InfonextpheadtailNULLwhile ( ( c=getchar ( ) ) != n ) tail = append ( tail , c ) ;Xuan shanli第七章第七章 结构与联合结构与联合在尾部追加节点在尾部追加节点步骤:步骤:为新节点分配内存。为新节点分配内存。建立新节点的成员项。建立新节点的成员项。建立链接关系。建立链接关系。struct slist *append(struct slist *ptr, char c) struct slist *p ; p=(struct
24、 slist *)malloc (sizeof(struct slist ) ; p-info=c ; p-nextp=NULL; ptr-nextp=p ; return (p) ;InfonextpheadtailNULLInfonextppNULLtail tail Xuan shanli第七章第七章 结构与联合结构与联合删除节点函数删除节点函数infonextpinfonextpinfonextpvoid cdelete(struct slist *pcdel) struct slist *p ; p=pcdel-nextp ; pcdel-nextp=pcdel-nextp-next
25、p ; free (p ) ; p 思考题:思考题: 编写一个函数,在当前指针位置插入节点。编写一个函数,在当前指针位置插入节点。Xuan shanli第七章第七章 结构与联合结构与联合7.3 联联 合合(union) 概念:概念:不同数据类型的集合;每个成员项共用一段内存空间;不同数据类型的集合;每个成员项共用一段内存空间;某一时刻只能对一个某一时刻只能对一个“活的活的active”成员项操作;成员项操作;联合类型的定义联合类型的定义 格式:格式:union 联合名联合名 type 成员项成员项 1 ; type 成员项成员项 2 ; type 成员项成员项 n ; ;union exam
26、int a ; float b ; char c ; ;联合变量的说明和引用联合变量的说明和引用可以用联合类型说明:联合变量、联合数组、指向联合指针。可以用联合类型说明:联合变量、联合数组、指向联合指针。union exam x , *px , y10 ;引用:引用变量的成员项。引用:引用变量的成员项。 通过变量引用:通过变量引用: 变量名变量名.成员项名成员项名通过指针引用:通过指针引用: 指针指针-成员项名成员项名Xuan shanli第七章第七章 结构与联合结构与联合联合与结构的区别联合与结构的区别struct exam int a ; float b ; char c ; x ;xab
27、cunion exam int a ; float b ; char c ; x ;xb ac 结构变量的每个成员项有独立的内存单元,结构变量的每个成员项有独立的内存单元,而联合变量的成员项以最大的成员项开辟单元而联合变量的成员项以最大的成员项开辟单元后,所有成员项共用单元。后,所有成员项共用单元。sizeof (struct exam)Xuan shanli第七章第七章 结构与联合结构与联合举例:举例:#include void main (void) union exam int i ; char ch2 ; x ; x.i = 24897 ;/* i:0 x6141*/ printf (“i=%xHn” , x.i); printf (“ch0=%xH,ch1=%xHn” , x.ch0 , x.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教科版科学六上《打开盖子的工具》课件
- 《会跳舞的洋娃娃》课件一
- 教科版科学五下《摆的研究》课件
- 冀教版数学四上第六单元《认识更大的数》课件2
- 高三成绩分析班会
- 第8章 企业投资的税务合规计划
- 信阳市出山店水库集中式饮用水水源地生态环境保护项目环境影响报告表
- 药师考试临床用药技能专项训练题库及答案
- 危险化学品通风设施基础知识安全培训
- 危险化学品剧毒品基础知识安全培训
- 膝关节疼痛与护理查房
- “练、强、学”题库(全警普测)及答案
- 2025年高尔夫球教练职业能力测试卷:初级技能评估试题
- 共享仓库管理合作协议
- 12~30月龄儿童健康检查记录表
- 体育-水平二-三年级篮球大单元教学计划表及原地运球教学设计、教案
- 食管胃底静脉曲张出血课件
- DL-T5191-2004风力发电场项目建设工程验收规程
- JJG 693-2011可燃气体检测报警器
- 水质自动监测系统
- 幼儿园优质公开课:大班数学《数字捉迷藏》课件PPT
评论
0/150
提交评论