计算机本科c语言第十一章讲.ppt_第1页
计算机本科c语言第十一章讲.ppt_第2页
计算机本科c语言第十一章讲.ppt_第3页
计算机本科c语言第十一章讲.ppt_第4页
计算机本科c语言第十一章讲.ppt_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

第十一章 结构体与共用体 重点: 、结构体与联合体的概念 、结构体定义、结构体变量的定 义与引用 3、枚举类型的概念 已讲过的数据类型有: 简单类型:整型、实型、字符型。变量与变量之间无 固 定的内在连续,分别表示独立的数据,无 从 属关系。 数组型: 同一类型数据的组合,并用下标把数组 的各元素有序地联系起来, 指针型: 主要用于动态存储分配。 结构体: 用结构体,用户可以根据需要定义一种数 据类型,这种数据类型是由C语言中基本数据 类型或用户已定义的数据类型组成的“复合类 型”。 将不同类型的数据组合成一个有机的整体,以便 于引用。这些组合在一个整体中的数据是互相 联系的。例如,一个人的姓名、性别、年龄、 家庭地址等项。这些项都与某一个人相联系, 应当把它们组织成一个组合项,在一个组合项 中包含若干个类型不同(当然也可以相同)的 数据项。C语言提供了这样一种数据结构,它称 为结构体(structure)。它相当于其它高级语 言中的“记录”。 例如:上面讲的,由不同类型的数据项组成的复合类型 ,可以定为如下结构 struct person char name20; int age; char sex; long num; char nation; 成员名 int education; char addrees20; long tel; ; 共占54字节 上面定义了一个结构体类型,struct person(struct是关键 字,不能省略),表示这是一个“结构体类型”。它包括 name,age, address等不同类型的数据项。应当注意:struct person是程序设计者自己定义的类型名。它和系统已定义了 的标准类型(如int、char、float、double等)一样可以用 来作为定义变量的类型。 定义一个结构体类型的一般形式为: struct 结构体名 成员表列; 花括弧内是该结构体中的各个成员(或称分量),由它们组成 一个结构体。例如,上例中的name,sex等都是成员。对各成 员都应进行类型说明,即 类型标识符 成员名 也可以把“成员表列”称为“域表”。 结构体的定义明确地描述了该结构的组织形 式,在程序执行时,结构体的定义并不引起 系统为该结构分配内存空间,结构体的定义 仅仅定义了一种特定的数据类型,它制定了 这种构造使用内存的模式,这是一种数据类 型的定义,并不是变量的定义。 11.2 定义结构体类型变量的方法 要定义一个结构体类型的变量,可以采取以下三种方法 。 一、先定义结构体类型再定义变量名 如上面已定义了一个结构体类型 struct person,可以用它来定义变量。 如struct person person1,person2; 定义person1和person2为struct person类型变量,即它 们具有struct person类型的结构。如图所示。 student1 ZhangXin M 19 student2 WangLI F 20 应当注意:将一个变量定义为标准类型(基本数据类型 )与定义为结构体类型不同之处在于:后者不仅要求 指定变量为结构体类型,而且要求指定为某一特定的 结构体类型(例如,struct person),不能只指定为 “struct型”而不指定结构体名。 而在定义变量为整型时,只需指定为int型即可。换句 话说,可以定义许多种具体的结构体类型。 为了使用方便,人们通常用一个符号常量代表一 个结构体类型。在程序开头,用 define PERSON struct person 这样在程序中, PERSON与struct person完全等效。 PERSON char name20; int age; char sex; long num; char nation; int education; char addrees20; long tel; ; 可以直接用PERSON定义变量。如 PERSON person1,person2; 用这种方法定义变量和用int,float定义变量的 形式相仿,不必再写关键字struct.如果程序 规模比较大,往往将对结构体类型的定义集中 放到一个文件(以为后缀的“头文件“)中 。哪个源文件需用到此结构类型则可用 include命令将该头文件包含到本文件中。这 样做便于装配,便于修改,便于使用。 二、在定义类型的同时定义变量 例如: struct student int num; char name2; char sex; int age; float score; char addr; student1,student2; 它的作用与前面定义的相同。既定义了两个 struct student类型的变量 student1,student2.这种形式的定义的一般形 式为:struct 结构体名 成员表列 变量名表列; 三、直接定义结构类型变量 其一般形式为: struct 成员表列; 变量名表列; 即不出现结构体名。 关于结构体类型,有几点要说明: 类型与变量是不同的概念,不要混同 。对结构体变量来说,在定义时一般先定义 一个结构体类型,然后定义变量为该类型。 只能对变量赋值、存取或运算,而不能对一 个类型赋值、存取或运算。在编译时,对类 型是不分配空间的,只对变量分配空间。 对结构体中的成员(即“域”),可 以单独使用,它的作用与地位相当于普通变 量。关于对成员的引用方法见11.3。 成员也可以是一个结构体变量。 如:struct date int month; int day; int year;; struct student int num; char name20; char sex; int age; Struct date birthday; char addr30; student1,student2; 然后在定义struct student类型时,成员 birthday的类型定义为struct date类型. struct student的结构见图所示。已 定义的类型struct date与其它类型(如 int ,char)一样可以用来定义成员的类型 birthday num name sex age month day year addr 11. 结构体类型变量的引用 在定义了结构体变量以后,当然可以引用这个变 量。但应遵守以下规则: 不能将一个结构体变量作为一个整体进行输入 和输出。例如,已定义:student1和student2为结 构体变量并且它们已有值。不能这样引用: printf(”%d,%s,%c,%d,%f,%sn,”, student1); 只能对结构体变量中的各个成员分别输出。引用方式 为: 结构体变量名.成员名 例如:student1.num表示student1变量中的num 成员, 即student1的num(学号)项。可以对变量的成员 赋值,例如: student.num=10010; “”是成员(分量)运算符,它在所有的运算符中 优先级最高,因此可以把srudent1.num作为一个整 体来看待。 上面赋值语句的作用是将整数10010赋给student1变量 中的成员nu。 新的标准允许将一个结构体变量直接赋值给另 一个具有相同结构的结构体变量。 如果成员本身又属一个结构体类型,则要用 若干个成员运算符,一级一级地找到最低的一级的 成员。只能对最低级的成员进行赋值或存取以及运 算。例如,对上面定义的结构体变量student1,可 以这样访问各成员: student1.num student1.birthday.month student1. birthday.day student1. birthday.year 注意:不能用student1.birthday 来访问 student1变量中的成员birthday,因为birthday本 身是一个结构体变量。 对成员变量可以像普通变量一样进行各种 运算(根据其类型决定可以进行的运算)。 例如: student2.score=student1.score; sum=student1.score+student2.score; student1.age+; +student1.age; 由于.”运算符的优先级最高,因此 student1.age+是对student1.age进行自加运算 ,而不是先对age进行自加运算。 可以引用成员的地址,也可以引用结 构体变量的地址。如: scanf(“d”, 结构体变量的地址主要用于作函数参数,传递 结构体变量的地址。 11. 结构体变量的初始化 过去许多版本规定,只有当结构体变量为全 局变量或静态变量时,才能进行初始化。不能对动 态局部变量进行初始化。新版本无此限制。 一、对外部存储类型的结构体变量进行初始化 。 例1 struct student long int num; char name20; char sex; char addr; a89031,“Lilin”,M,“123beijing Road”; main) printf(”.:%ldnname:%snsex:%cn address:%sn“,a.num,,a.sex, a.addr); 运行结果如下: : :in e: :beij 二、对静态存储类型的结构体变量进行初始化。上面 例1的定义部分可以放到n函数中。 main() static struct student long int num; char name20; char sex; char addr20; a=89031,“Li Lin“,M,“123Beijing Road“; printf(“No.:%1dnname:%snsex:%cnad dress:%sn“,a.num,,a.sex,a.addr); 三、过去许多版本规定,自动变量不能在定 义时赋初值,只能在函数执行时用赋值语句 对各成员分别赋值。新的标准无此限制, 允许对自动变量初始化。 11. 结构体数组 一个结构体变量中可以存放一组数据(如 一个学生的学号、姓名、成绩等数据) 。如果有个学生的数据需要参加运算, 显然应该用数组,这就是结构体数组。结构 体数组与以前介绍过的数值型数组不同之处 在于每个数组元素都是一个结构体类型的数 据, 它们都分别包括各个成员(分量)项。 一、结构体数组的定义 和定义结构体变量的方法相仿,只需说明其为数 组即可。如: struct student int nem; char name20; char sex; int age; float score; char addr30; ; struct student stu3; 以上定义了一个数组,其元素为struct student类型数据,数组有3个元素。也可以直接定 义一个结构体数组,如: struct student int num; stu3; 或 struct int num; stu3; 数组各元素在内存中连续存放,见p266图1. 示意。 二、结构体数组的初始化 结构体数组可以初始化。如: struct student int num; char name20; char sex; int age; float score; char addr30; stu3=101,“Li Liu”,m,18,87.5,“103Beijing Road“, 102,“Zhang”,m,19,99,”130ShangHai Road”,104,“Wang Min”,F,20,78.5,”10Guangzhu Road”; 定义数组stu时,元素个数可以不指定,即写成以下形式 :stu =,; 编译时,系统会根据给出初值的结构体常量的个数来确定 数组元素的个数。 当然,数组的初始化也可以用以下形式: struct student int num ; struct student stu=, ; 即先定义结构体类型,然后定义数组为该结构体类型,在 定义数组时初始化。从以上可以看到,结构体数组初始 化的一般形式是在定义数组的后面加上: 初值 表列; 三、举例 下面举一个简单的例子来说明结构体数组 的定义和引用。 例1.对候选人得票的统计程序。设有 三个侯选人,每次输入一个得票的候选人的 名字,要求最后输出各人得票结果。 程序如下: struct person char name20 int count; lead3=“Li“,0,“Zhang“,0,“Fun“,0; main() int i,j;char leader20; for(i=0;i来代替,即:所指向的结构体变量中的 成员。同样,(*p)e等价于-e 。也就是说,以下三种形式等价: 结构体变量.成员名; (*).成员名; -成员名 上面程序中最后一个函数中的输出项表 列可以改写为: -num,p-name,p-sex,p-score 其请分析以下几种运算: -n 得到指向的结构体变量中的成员的值。 - 得到指向的结构体变量中的成员的值 ,用完该值后使它加。 - 得到指向的结构体变量中的成员的值 使之加(先加)。 1.6.指向结构体数组的指针 以前已经介绍过,可以使用指向数组或数组元素的指针和 指针变量。同样,对结构体数组及其元素也可以用指针 或指针变量来指向。 例11 struct student int num; char name20; char sex; int age; ; struct student stu3= 10101,”li lin”,M,18, 1012,”zhang Fun”,M,19, 10104,“wang Min“,F,20; main() struct student *p; printf(”No. Name sex agen”); for(=stu;pstu+;+) printf(”%5d%-20s%2c%4dn”,p-num, p-name,p-sex,p-age); 在第一次循环中输出stu0的各个成员值。然后 执行+,使自加1。P+1意味着增加的地址值 为结构体类型数组stu的一个元素所占的字节数( 在本例中为1=字节),+ 使指向stu1的起始地址,在第二次循环中输 出stu1的各成员值。在执行+后,的值等 于stu+2,再输出stu2的各成员值。 在执行+后,的值变为stu+3,已不再小于 stu+3了,不再执行循环。 注意以下两点: 如果的初值为stu,即指向第一个元素 ,则p+1后指向下一个元素的起始地址。例如: (+p)-num 先使自加1,然后得到它指向 的元素中的成员值(即10102)。 (p+)-num 先得到-num的值(即10101 ), 然后使请注意以上二者的不同。 指针已定义为指向struct student类型 的数据,它只能指向一个结构体型数据(也就是 的值是stu数组的一个元素的起始地址),而不 能指向一元素中的某一成员(即的地址不能是 成员的地址),例如,下面是不对的: = 11.用指向结构体的指针作函数参 数 有时想将一个结构体变量的值传递给另 一个函数,但原来的标准不允许用结构 体变量作为函数参数。那么用什么方法来 解决这个问题呢?有两个方法:用结构 体变量的成员作参数。例如,用stu1 num或stu2name作函数实参,将实参 值传给形参。 用法和用普通变量作实参是一样的,属“值传递” 方式。用指向结构体变量(或数组)的指针作 实参,将结构体变量(或数组)的地址传给形参 。 例1】有一个结构体变量stu,内含学 生学号、姓名和三门课的成绩,要求在main函数 中赋以值,在另一函数print中将它们打印输出。 #include “string.h“ #define format “%dn%sn%fn%fn%fn” struct student int num; char name20; float score3; main() p void print(); struct student stu; stu.num=12345; strcpy(,”LiLi”); stu.score0.5 stu.score1; stu.score=78.6; print( printf(format,stud.num, , stud .score, stud .score1, stud score2); printf(”n”); 把一个完整的结构体变量作为参数传递,虽然 合法,但要将全部成员值一个一个传递,费时间 又费空间,开销大。如果结构体类型中的成员很 多,或有一些成员是数组,则程序运行效率会大 大降低。在这种情况下,用指针作函数参数比较 好,能提高运行效率。 11.6举例 例11.6有个学生,每个学生包括学号、 姓名、成绩。要求找出成绩最高者的姓名和成绩 。 程序如下: main() struct student int num; char name20; float score; ; struct student stu4; struct student *p int i,temp=0; float max; for(i=0;Inum,-name,-score); 运行情况如下: i g : : : : 程序中定义s为struct student类型的数组。为 指向struct student类型数据的指针变量。第一个 for循环输入个学生的数据。在第二个for循环中 ,先使变量ax的值等于st0.score(即第 个学生的成绩),然后用ax与其余个学生的成 绩(即stscore)相比, 若后者大于ax,则将大者放人ax,并记下此时i 的值(将的值存放到保存起来)。接 着使st十te,也就是将定位于成绩 最高者的那个数组元素处(见图11.10)。最后输 出所指的元素中各个成员值。 11.7 用指针处理链表 11.7.1链标概述 链表是一种常见的重要的数据结构。它是动态 地进行存储分配的一种结构。我们知道,用数组 存放数据时, 必须事先定义固定的长度(即元素个数)。比如, 有的班级有人,而有的班只有人,如 果要用同一个数组先后存放不同班级的学生数据 ,则必须定义长度为100的数组。如果事先难以确 定一个班的最多人数,则必须把数组定得足够大 ,以能存放任何班级的学生数据。显然这将会浪 费内存。链表则没有这种缺点,它根据需要开辟 内存单元。图11.10表示最简单的一种链表(单向 链表)的结构。链表有一个“头指针”变量,图 中以表示,它存放一个地址。 1249 A 135 6 B 147 5 C 102 1 D NUL L head 1249135614751021 该地址指向一个元素。链表中每一个元素称为“结 点”,每个结点都应包括两个部分:一为用户需 要用的实际数据,二为下一个结点的地址。从图 看出,head指向第一个元素;第一个元素又指向 第二个元素;,直到最后一个元素,该元素 不再指向其它元素,它称为表尾”,它的地址 部分放一个”(表示“空地址”)。 链表到此结束。 可以看到:链表中各元素在内存中可以不是连 续存放的。要找某一元素,必须先找到上一个元 素,根据它提供的下一元素地址才能找到下一个 元素。 如果不提供“头指针”(head),则整个链表都 无法访问。链表如同一条铁链一样,一环扣一 环,中间是不能断开的。打个通俗的比方:幼 儿园的老师带领孩子出来散步,老师牵着第一 个小孩的手,第一个小孩的另一只手牵着第二 个孩子,这就是一个“链”,最后一个 孩子有一只手空着,他是“链尾”。要找这个 队伍,必须先找到老师,然后顺序找到每一个 孩子。 可以看到,这种链表的数据结构,必须利用 指针变量才能实现 即:一个结点中应包含一个指针变量,用它存放 下一结点的地址。 前面介绍了结构体变量,它包含若干成员。这 些成员可以是数值类型、字符类型、数组类型 ,也可以是指针类型。这个指针类型可以是指 向其它结构体类型数据,也可以指向它所在的 结构体类型。例如: struct student int num; float score; struct student * next; next是成员名,它是指针类型的,它指向 struct student 类型数据(这就是next所在的 结构体类型)。用这种方法可以建立链表。见图 11.11。 其中每一个结点都属于struct student类型, 它的成员next存放下一结点的地址,程序设计人 员可以不必具体知道地址值, 只要保证将下一个结点的地址放到前一结点的成员 next中即可。 请注意:上面只是定义了一个struct student 类型,并未实际分配存储空间。前面讲过,链表 结构是动态地分配存储的,即在需要时才开辟一 个结点的存储单元。怎样动态地开辟和释放存储 单元呢?语言编译系统的库函数提供了以下有 关函数。 .malloc(size) 在内存的动态存储区中分配 一个长度为size的连续空间。 此函数的值(即“返回值“)是一个指针,它的值 是该分配域的起始地址。如果此函数未能成功 地执行,则返回值为。 .calloc(n,size) 在内存的动态区存储中分 配个长度为的连续空间。函数返回 分配域的起始地址;如果分配不成功,返回 。 .free(ptr) 释放由指向的内存区 。是最近一次调用calloc或malloc函数 时返回的值。 上面三个函数中,参数和为整型 ,为字符型指针。 请注意:许多版本提供的mallo和calloc函数 得到的是指向字符型数据的指针。新标准提 供的malloc和calloc函数规定为void *类型。 有了本节所介绍的初步知识,下面就可以对 链表进行操作了(包括建立链表、插入或删除 链表中一个结点等)。有些概念需要在后面的 应用中逐步建立和掌握。 11.7.2 建立链表 例:要求建立一个含三个结点的链表,存放学生数 据(为简单起见,假定学和生数据结构中只有学 号和年龄) #define NULL 0 #define TYPE struct student #define LEN sizeof(struct student) struct student int num; int age; struct student *next; TYPE *creat(int n) struct student *head,*pf,*pb; int t; for (t=0;tnum, if(t=0) pf=head=pb; else pf-next=pb; pb-next=NULL; pf=pb; return (head); 11.7.3输出链麦 将链表中各结点的数据依次输出。这个问题 比较容易处理。首先要知道链表头元素的地址 ,也就是要知道的值。然后设一个指 针变量p,先指向第一个结点,输出所指的结 点,然后使后移一个结点,再输出。直到链 表的尾结点。 例11.9写出输出链表的函数。 参照书中p279 void print(head) struct student *head; struct student *p; printf(“n Now,These are record:n”); p=head; if (head!=NULL) do printf(“%d %d”,p-num,p-age); p=p-next;while(p!=NULL); 11.7.4链麦的删除操作 已有一个链表,希望删除其中某个结点。怎 样考虑此问题的算法呢,先打个比方: 一队小孩(.B.C.D.E)手拉手,如果某一小孩( )想离队有事,而队形仍保持不变。只要将 的手从两边脱开,改为与D拉手即可。 与此相仿,从一个链表中删去一个结点,并不是 真正从内存中把它抹掉,而是把它从链表中分 离开来,即改变链接关系即可。 参照书中p281 TYPE *delete(TYPE *head,int num) TYPE *pf,*pb; if (head=NULL) printf(“n enpty list!n”); return (head); pb=head; while(pb-num!=num pb=pb-next; if(pb-num=num) if (pb=head) head=pb-next; /*如找到被删结点,且为第一结点则使head指向第二个结点否则使pf所指结点的指针指向下一结点*/ else pf-next=pb-next; free(pb); printf(“The node is deletedn”); else printf(“The node not been foud!n”); 11.7.对链表的插入操作 将一个结点插入到一个已有的链表中。设已有 的链表中各结点中的成员项(学号)是按 学号由小到大顺序排列的。 由于插入的位置在原链表中不同,因而算法也不同 ,根据插入位置可以分成下面四种: 第一种情况是原来的链表是空表,这时只需使头指 针指向被插结点。 第二种情况是被插入的结点的值最小,这时应插入 第一个结点之前,这种情况下的算法可以设计成 :使头指针指向被插结点,而被插结点的指针指 向原来的第一个结点: pi-next=pb; head=pi; 第三种情况是插入结点的位置是链表中间的某 一位置,这可使插入位置的前一个结点的指 针域指向被插结点,使被插结点的指针域指 向插入位置的后一个结点。即: pi-next=pb; pf-next=pi; 第四种情况是插入结点的位置在链表的末尾, 这种情况只需使原链表表末结点指针域指向 被插结点,而被插结点指针域置为NULL。 pb-next=pi; Pi-next=NULL; TYPE *insert(TYPE *head,TYPE *pi) TYPE *pf,*pb; pb=head; if(head= =NULL) head=pi; pi-next=NULL; else while (pi-numpb-num) pb=pb-next; if(pi-numnum) if(head=pb) head=pi; else pf-next=pi; pi-next=pb; else pb-next=pi; pi-nex=NULL return head; 下面主函数的作用将上面的四种操作结合起来 组成一个完整的链表程序: main( ) TYPE *head,*pnum; int n,num; printf(“input number of node:n”); scanf(“%d”, head=creat(n); print(head); printf(“input the deleted number:n”); scanf(“%d”, head=delete(head,num); print(head); printf(“input the inserted number and age:n”); pnum=(TYPE *)malloc(LEN); scanf(“%d%d”, head=insert(head,pnum); print(head); 11 共用体 11.1 共用体的概念 有时需要使几种不同类型的变量存放到同一内 存单元中。例如,可把一个整型变量、一个 字符型变量、一个实型变量放在同一个地址 开始的内存单元中(见图1.4)。以上 三个变量在内存中占的字节数不同,但都从 同一地址开始(图中设地址为)存 放。 1000 i ch f 也就是使用覆盖技术,几个变量互相覆盖。这种使 几个不同的变量共占同一段内存的结构,称为“ 共用体”类型的结构。 “共用体”类型变量的定义形式为: union 共用体名 成员表列; 变量表列; 例如: io data i i; ar ; floa ; ,b,; 也可以将类型定义与变量定义分开: io ta i; h h; floa ; ; union data a,b,c; 即先定义一个 类型, 再将a b定义为union ata类型。当然也可以直 接定义共用体变量,如: union int i; char f; a,b,c; 可以看到,“共用体”与“结构体”的定义形 式相似。但它们的含义是不同的。 结构体变量所占内存长度是各成员占的内存长 度之和。每个成员分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长 度。例如,上面定义的“共用体“变量a,b,c各占 个字节(因为一个实型变量占个字节),而 不是各占1=个字节。 1共用体变量的引用方式 只有先定义了共用体变量才能引用它。而且不能 引用共用体变量,而只能引用共用体变量中的成员 。例如,前面定义了a,b,c为共用体变量,下面的 引用方式是正确的: .i(引用共用体变量中的整型变量i) .(引用共用体变量中的字符变量) .f(引用共用体变量中的实型变量) 不能只引用共用体变量,例如: (“ %d“,a) 是错误的,的存储区有好几种类型,分别占不同长 度的存储区,仅写共用体变量名a,难以使系统确定 究竟输出的是哪一个成员的值。应该写成 (”d,.i)或(”%c“,. )等 1.共用体类型数据的特点 在使用共用体类型数据时要注意以下一些特 点: 同一个内存段可以用来存放几种不同 类型的成员,但在每一瞬时只能存放其中 一种,而不是同时存放几种。也就是说, 每一瞬时只有一个成员起作用,其它的成 员不起作用,即不是同时都存在和起作用 。 共用体变量中起作用的成员是最后一次存 放的成员,在存入一个新的成员后原有的成 员就失去作用。如有以下赋值语句).i= ; .=a;.; 在完成以上三个赋值运算以后,只有.f是有 效的,.和.已经无意义了。此时用 printf(”“,.)是不行的,而用 rit(”f”,a.f)是可以的,因为 最后一次的赋值是向.f赋值。因此在引用 共用体变量时应十分注意当前存放在共用体 变量中的究竟是哪个成员。 共用体变量的地址和它的各成员的地址都是同 一地址。例如: float ; 1,a,1.5; (不能初始化) ; (不能对共用体变量赋值) ; (不能引用共用体变量名以得到 值) 不能把共用体变量作为函数参数,也 不能使函数带回共用体变量,但可以使用指 向共用体变量的指针(与结构体变量这种用 法相仿)。 .共用体类型可以出现在结构体类型定义中 ,也可以定义共用体数组。反之,结构体也 可以出现在共用体类型定义中,数组也可以 作为共用体的成员。 枚举类型 “枚举”就是将某一变量的所有可能取值都罗列 出来,比如一周之内有7天,可以用星期一、 星期二、星期日这样的数据列举出来, 一年之内有12个月,可以用一月、二月 十二月列举出来,在C语言中,专门提供了一 种类型来表示这样的数据,这就是枚举类型 ,它也是一种基本数据类型。 枚举类型的一般定义形式: enum 枚举名 枚举值表列; 如 enum weekday sun,mon,tue,wed,thu,fri,sat; 定义了枚举类型之后,就可以定义枚举类型变量 如: enum weekday d; 或者直接定义: enum weekday sun,mon,tue,wed,thu,fri,satd; 也可以直接定义: enum sun,mon,tue,wed,thu,fri,satd; 在上面的定义中,像sun,mon,tue等被称为枚举元 素或者是枚举常量,它们是由程序员定义的标 志符,标志符一旦定义完成后,在这个程序中 就始终代表一定的意思。 main( ) enum body a,b,c,dmonth31,j; int t; j=a; for (t=1;td) j=a; for (t=1;tnum B) p+ C) (*p).num D) p= char arr20; main() struct ps bt; printf(“bt size :%dn”,_) 7. 为建立如图所示的存储结构(即每个结点两 个域,data是数据域,next是指向结点的指针 域),请将定义补充完整。 data next struct schar data; _node; 8. 以下程序用来按学生姓名查询其排名和平均成绩,查询可连 续进行,直到键入0时结束,请在_内填入正确内容。 #include #include #define NUM 4 Struct student int rank; char *name;

温馨提示

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

评论

0/150

提交评论