




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计,第10章 结构体、共同体与枚举类型,问题:实际应用中,通常会将相关的不同类型的数据项组成一个有机的整体,这些数据项在计算机中如何表示?,学生登录信息 学生成绩表,这些数据的特点是: 1、有多项不同类型数据组成 2、各项数据占用空间大小有可能不同 C语言为了表示这种数据,定义了一种数据结构:结构体。,引子,第10章 结构体、共同体与枚举类型,本章难点,结构体类型及变量 结构体数组的使用 指针和结构体 共用体、枚举、用户自定义类型,结构体指针变量的引用 链表的建立、插入、删除、输出等操作 共用体类型的数据特点,本章要点,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,本章主要内容,结构体类型定义 结构体是一种构造数据类型 一个“结构体”类型由若干“成员”组成,每一个成员可以是一个基本数据类型或者是一个结构体类型。 结构体类型定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,10.1 结构体变量的定义,定义义结构体类型时,应注意 成员类型可以是除本身结构体类型之外的任何已有类型,也可以是任何已有类型(包括本身类型在内)的指针类型,即构成嵌套的结构。 当一个结构体类型定义在函数之外时,它具有全局作用域;若定义在任一对花括号之内,则具有局部作用域,其作用范围是所在花括号构成的块。 结构体是一种复杂的数据类型,是数目固定、类型不同的若干成员的集合,结构体类型的定义只是列出了该结构的组成情况,编译系统并未因此而分配存储空间,当定义了结构体类型的变量或数组后,编译系统才会分配存储空间。 成员名可以与程序中的变量名相同,二者不代表同一个对象。 如果两个结构体的成员类型、名称、个数相同,但结构体名不同,也是两个不同的结构类型。,例如,可将日期定义为一个结构体: struct date int month; int day; int year; ;,结构体变量的定义 先定义结构体类型,再定义结构体变量 先定义结构体类型,再定义结构体变量 例如 在定义结构体类型的同时定义结构体变量 例如 直接定义结构体变量 例如,struct stu int num; char name20; char sex; int age; float score; struct date birthday; ; struct stu boy1,boy2;,struct stu int num; char name20; char sex; int age; float score; struct date birthday; boy1,boy2;,struct int num; char name20; char sex; int age; float score; struct date birthday; boy1,boy2;,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体变量的引用 引用方式: 结构体变量名.成员名 其中点号“.”称为成员运算符,它在所有的运算符中优先级最高。 引用结构体变量时,应注意以下几点 不能将一个结构体变量作为一个整体进行输入输出 如果成员本身又是一个结构体类型,则要用若干个成员运算符逐级找到最低一级的成员才能引用 对成员变量可以像普通变量一样进行各种运算 可以引用结构体变量成员的地址,也可以引用结构体变量的地址,10.2 结构体变量的引用和初始化,例如,对前面定义的结构变量boy1和boy2,其成员的引用形式如下。 boy1.num /* 第一个人的学号 */ boy2.sex /* 第二个人的性别 */,结构体变量的初始化 本例中,对结构体变量boy1作了初始化赋值,然后把boy1的值整体赋予boy2,最后用printf函数输出boy2各成员的值。,例对结构变量初始化。 #include main() struct stu int num; char name20; char sex; int age; float score; boy2,boy1=102,“Zhang ping“,M,20,78.5; boy2=boy1; printf(“Number:%dnName:%sn“,boy2.num,); printf(“Sex:%cnage:%dScore:%4.1fn“,boy2.sex,boy2.age,boy2.score); ,运行结果: Number:102 Name:Zhang ping Sex:M Age:20 Score:78.5,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体数组的定义 结构体数组的每一个元素都具有相同的结构体类型 三种形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,10.3 结构体数组,结构体数组初始化 一个结构体数组的元素相当于一个结构体变量,引用结构体数组元素的一般形式为 结构体数组名下标.成员名 例如,#include struct stu int num; char name20; char sex; float score; boy5= 101,“Li ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ; main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; ave=s/5; printf(“average=%fncount=%dn“,ave,c); ,运行结果: average=69.000000 count=2,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例如struct stu boy,*pstu; 定义了结构体变量boy和结构体指针变量pstu,通过赋值语句可使pstu指向boy, 构体指针可以访问结构体变量的各个成员,一般形式为 结构体指针变量-成员名 运算符“-”的优先级比较高,高于算术运算符、关系运算符、逻辑运算符 例如 +pstu-num 等价于 +(pstu-num) 结构体指针访问结构体变量的形式也可以表示为 (*结构体指针变量).成员名 例如 (*pstu).num 应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”,10.4 结构体指针变量,存放结构体变量在内存的起始地址,以下三种形式是等价 结构体变量名.成员名 (*结构体指针变量).成员名 结构体指针变量-成员名,结构指针变量的引用 #include struct stu int num; char name20; char sex; float score; boy=102,“Zhang ping“,M,78.5,*pstu; main() pstu= ,运行结果: Number=102 Name= Zhang ping Sex=M Score=78.500000 Number=102 Name= Zhang ping Sex=M Score=78.500000 Number=102 Name= Zhang ping Sex=M Score=78.500000,指向结构体数组的指针 普通数组可以通过指针变量来访问,同样,也可以通过结构体指针访问结构体数组。 例如 pstu=boy;或pstu= pstu就指向了该结构体数组的首地址(即第一个元素boy0的地址)。结构体指针pstu加1则指向下一个元素,用指针变量输出结构体数组。 #include struct stu int num; char name20; char sex; float score; boy5= 101,“Zhou ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“Liu fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ; main() struct stu *ps; printf(“NotNametttSextScoretn“); for(ps=boy;psnum,ps-name,ps-sex,ps-score); ,运行结果: No Name Sex Score 101 Zhou ping M 45.0 102 Zhang ping M 62.5 103 Liu fang F 92.5 104 Cheng ling F 87.0 105 Wang ming M 58.0,本章主要内容,10.1,10.2,10.3,10.4,10.5,结构体变量的定义,结构体变量的引用和初始化,结构体数组,结构体指针变量,结构体与函数,结构体变量作为函数参数 结构体变量的成员可作为函数的实参,用法和普通变量作实参一样 例如,10.5 结构体与函数,显示学生的基本信息,利用结构体变量作为函数参数编程。 #include #include struct stu int num; char name20; char sex; float score; ; main() void list(struct stu student); struct stu student; student.num=101; strcpy(, “Zhou ping“); student.sex=M; student.score=45; list(student); void list(struct stu student) printf(“Number=%dtName=%sn“,student.num,); printf(“Sex=%cttScore=%fn“,student.sex,student.score); ,运行结果: Number=101 Name=Zhou ping Sex=M Score=45.000000,返回结构体类型数据的函数 函数的返回值可以是整型、实型或指针类型等 例如,显示学生的基本信息,利用结构体变量作为函数参数编程。输入数据部分用函数实现 #include struct stu int num; char name20; char sex; float score; student; main() void list(struct stu student); struct stu newstudent(); student=newstudent(); list(student); void list(struct stu student) printf(“Number=%dtName=%sn“,student.num,); printf(“Sex=%cttScore=%fn“,student.sex,student.score); struct stu newstudent() struct stu newstu; scanf(“%d“, ,运行结果: 101Li ping M 76 Number=101 Name=Li ping Sex=M Score=76.000000,结构体指针作为函数参数 结构体指针作为函数的参数时,传递的只是地址,从而减少结构变量作参数时引起的空间和时间上的开销 例如,显示学生的基本信息,利用结构体指针变量作为函数参数编程。 #include struct stu int num; char name20; char sex; float score; ; main() void list(struct stu *student); struct stu student; student.num=101; strcpy(, “Zhou ping“); student.sex=M; student.score=45; list( ,运行结果: Number=101 Name=Zhou ping Sex=M Score=45.000000,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,位段结构体类型和位段结构体变量 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域” 定义 例如 位段结构体变量的定义与结构体变量定义方式相同 位域的引用 一般形式为:位段结构体变量.位域名 例如,10.6 位段结构体,struct 位段结构体名 类型标识符 位域1:位域长度; 类型标识符 位域2:位域长度; . . . 类型标识符 位域n:位域长度; ,struct bs int a:8; int b:2; int c:6; data;,位域的引用 #include main() struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit,*pbit; bit.a=1; bit.b=7; bit.c=15; printf(“%d,%d,%dn“,bit.a,bit.b,bit.c); pbit= ,运行结果: 1,7,15 0,3,15,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,链表概述 概述,是一种数据结构,可以动态分配内存,链表由结点组成,每个结点有数据域和指针域两个域。 “头指针”指向第一个元素结点,指针域指向下一结点。 结构定义,如 形式如右图所示 例如,10.7 链表,struct stu int num; char name20; struct stu * next; ,struct stu int num; char name20; struct stu *next; ;,动态内存管理 内存空间分配函数malloc 原型 void * malloc(unsigned int size) 例 float * pc; pc=(float*)malloc(5*sizeof(float); 内存空间函数calloc 原型 void * calloc(unsigned n, unsigned size); 例 pc=(float *)calloc(8,sizeof(float); 释放内存空间函数free 原型 void free(void * p); 例如,动态数组的建立和使用。 #include #include main() float *pf; int i,n; scanf(“%d“,/*调用free函数时,会自动将指针pf的类型转换为void指针类型 */ ,运行结果: 5 1.100000 2.200000 3.300000 4.400000 5.500000,创建链表 读取数据; 生成新结点; 将数据存入新结点; 将新结点插入到链表中。 例如:从键盘读入学生的信息,包括学号、成绩,当输入的学号为0时,表示建立链表结束。 流程图如图,#include #include #define LEN sizeof(struct stu)/*LEN为结构体类型struct stu的长度*/ struct stu int num; float score; struct stu *next; ; struct stu *creat() struct stu *head;/* 用于指向链表的第一个结点,即头指针 */ struct stu *p; /* 用于指向新生成的结点 */ struct stu *tail;/* 用于指向链表的最后一个结点 */ int x; tail=head=NULL; scanf(“%d“, ,顺序访问链表中的结点 所谓“访问”就是对各结点的数据域中的值进行修改、运算、输出等 例如:编写函数,顺序输出链表中各结点数据域中的内容。顺序输出链表的算法比较简单,只需利用一个工作指针(p)从头到尾依次指向链表中的每个结点,当指针指向某个结点时,就输出该节点数据域中的内容,直到遇到链表结束标志为止。如果链表为空,就输出提示信息。,void list(struct stu *head) struct stu *p; p=head; if(head!=NULL) printf(“The list records are:n“); do printf(“%dt%5.1fn“,p-num,p-score); p=p-next; /* p指针后移 */ while(p!=NULL); else printf(“The list is null“); main() struct stu *head; head=creat(); list(head); ,运行结果: 101 90 102 89 0 The list records are: 101 90.0 102 89.0,在链表中插入结点 指将一个结点插入到一个已有链表中,因此,创建链表的过程,也可以理解为将一个个结点插入到空链表中。 算法过程 输入数据 生成新结点 将数据存入新结点 在链表中寻找第一个大于新结点学号的结点 如果链表为空,直接插入新结点,即新结点为链表的唯一的结点 查找成功,该结点为链表的第一个结点,将链表的头指针指向新结点,新结点的next域指向原来链表的第一个结点,即插到表头之前 查找成功,该结点不是链表的第一个结点,将新结点插入到该结点之前,即插到表的中间 查找不成功,插入到链表末尾的后面 例如:编写函数,将一个结点插入到一个已有学生链表中,设已有链表按学号由小到大顺序排列。 程序运行过程,struct stu * insert(struct stu *head,struct stu *stud) struct stu *p0; /* p0指向要插入的新结点 */ struct stu *p1; /* p1指向链表中第一个学号大于新结点的学号的结点 */ struct stu *p2; /*p2指向p1的前驱结点,即p2的next域指向p1 */ p0=stud; p1=head; if(head=NULL) /* 情况,原来的链表为空表 */ head=p0; p0-next=NULL; else while(p1!=NULL) ,运行结果: 102 95 100 94 101 93 103 99 0 The list records are: 100 94.0 101 93.0 102 95.0 103 99.0,在链表中删除结点 过程 从p1指向的第一个结点开始,检查其数据是否等于给定的关键字(如学号),如果相等就将该结点删除,否则p1后移一个结点,再如此进行下去,直到遇到表尾为止。 如果删除的是第一个结点(由p1指向),例如,删除学号为100的学生结点,头指针指向第二个结点,操作为:head=p1-next,如图10-6所示 如果要删除的不是第一个结点,例如,删除学号为102的学生结点,即让学号为101的学生结点(由p2指向)的next指针域指向学号为103的学生结点,操作为:p2-next=p1-next,如图10-7所示 例如:编写链表删除函数,根据输入的学号删除学生结点。,struct stu *del(struct stu *head,int num) struct stu *p1; /*p1指向要删除的结点*/ struct stu *p2; /*p2指向要删除的结点的前驱结点*/ if(head=NULL) /*空链表*/ printf(“The list is NULLn“); else p1=head; while(p1!=NULL /*输出链表*/ ,运行结果: 02 95 100 94 101 93 103 99 0 The list records are: 100 94.0 101 93.0 102 95.0 103 99.0 please input the number for deletion:102 delete:102 The list records are: 100 94.0 101 93.0 103 99.0,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,共用体类型及其变量的定义 共用体变量中的所有成员占用同一段内存空间,共用体又称为“联合体” 共用体类型定义 例如,union 共用体名 类型标识符 成员名; 类型标识符 成员名; . ;,例 union data int i; char ch; float f; ;,类型定义不分配内存,10.8 共同体,先定义共用体类型后定义共用体变量 union data int i; char s6; float f; ; union data a,b,c;,同时定义共用体类型和变量 union data int i; char s6; float f; a,b,c;,直接定义共用体变量 union int i; char s6; float f; a,b,c;,共用体变量的定义有三种方式,共用体变量的引用 引用共用体变量成员方式有如下三种 例如 例如,共用体变量名.成员名= 共用体指针变量名-成员名= (*共用体指针变量名).成员名,程序示例 #include #include main() union char a4; struct bt char c1; char c2; char c3; char c4; chs; d; strcpy(d.a,“deab“); printf(“%c,%cn“,d.chs.c2, d.chs.c3); ,共用体变量的地址和它的各个成员的地址相同 d的成员a和chs的首地址相同,即a0、a1、a2和a3的地址依次与c1、c2、c3和c4相同 运行结果: e,a,程序示例 main() union char a; int b; long c; uu; uu.c=0x12345678; printf(“n1:a=%x,b=%x,c=%lx“,uu.a,uu.b,uu.c); uu.a=0x61; printf(“n2:a=%x,b=%x,c=%lx“,uu.a,uu.b,uu.c); uu.b=0x1234; printf(“n3:a=%x,b=%x,c=%lx“,uu.a,uu.b,uu.c); ,1:a=78,b=12345678,c=12345678 2:a=61,b=12345661,c=12345661 3:a=34,b=1234,c=1234,本章主要内容,10.6,10.7,10.8,10.9,10.10,位段结构体,链表,共同体,枚举类型,用typedef定义类型,枚举类型及变量 枚举类型是一个采用标识符表示的整型常数的集合,其定义类似于结构体类型。 定义 一般形式为 enum 枚举名 枚举常量1,枚举常量2,枚举常量n ; 其中,enum为关键字,表示枚举;枚举名是用户定义的标识符;枚举常量是用户定义的有意义的标识符。 例如: enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat,10.9 枚举类型,枚举变量的定义 先定义枚举类型再定义枚举变量 enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat; enum weekday a,b,c; 直接定义枚举变量 enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sata,b,c; 同时定义枚举类型和枚举变量 enum Sun,Mon,Tue,Wed,Thu,Fri,Sata,b,c;,枚举变量的赋值和使用 只能取其相应枚举类型所列出的枚举常量 例如: enum Sun,Mon,Tue,Wed,Thu,Fri,Sata,b,c; a=Sun; /*正确*/ a=Sunday /*错误*/ 例如 注意: 能使用赋值语句对枚举常量标识符赋值 只能把枚举常量值赋予枚举变量,不能把枚举常量所对应的序号直接赋予枚举变量 枚举常量不是字符常量也不是字符串常量,使用时不要加单、双引号 枚举常量可以进行比较运算,由它们对应的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔发音基础知识培训课件
- 2025年深圳房地产市场区域分化特点与投资策略深度分析报告
- 第一单元第3课一、《设计一幅雄鸡报晓图》教学设计 人教版初中信息技术七年级下册
- 医疗投放专业知识培训课件
- 第九课 国家安全要知晓教学设计小学地方、校本课程辽海版人与社会
- 五年级下册科学教学设计-15 溶洞里的钟乳石第2课时∣冀教版
- 保姆基础知识培训内容课件
- 3.3 化学方程式(第1课时)(教学设计)八年级科学下册同步备课系列(浙教版)
- 学校师德奖惩制度
- 高等数学1考试题及答案
- 2025年浙江高考数学试题及答案详解
- 国旗国歌国徽的课件
- 2024年辽宁省大连市政公用事业服务中心招聘雇员8人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 25《王戎不取道旁李》 教学设计
- 2024年咨询工程师继续教育城市轨道交通工程可行性研究报告编制方法考试答案
- 【项目方案】源网荷储一体化项目(储能+光伏+风电)规划报告
- 咖啡因实验报告认知功能与记忆力评估
- (正式版)SHT 3075-2024 石油化工钢制压力容器材料选用规范
- 各类质谱仪的优缺点分析 质谱仪解决方案
- 苏科版九年级数学下册《二次函数与一元二次方程》评课稿
- 医学细胞生物学课件:第四章 内膜系统及囊泡转运
评论
0/150
提交评论