版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、语言程序设计 第七章结构体共用体C第七章结构体、共用体和枚举类型 结构体类型概述 结构体类型变量的定义和引用 结构体数组 结构体变量作为函数参数 结构体变量与指针 动态存储分配-链表 共用体类型 枚举类型数据语言程序设计 第七章结构体共用体C1结构体类型概述结构体类型概述一、问题的提出一、问题的提出例例 给出给出1010个职工的姓名及编号,用函数实现以下功能:个职工的姓名及编号,用函数实现以下功能:1 1 将编号从小到大排列,相应的职工姓名同时调整将编号从小到大排列,相应的职工姓名同时调整2 2 输入职工编号,用折半查找法找到相应的职工姓名,并输出。输入职工编号,用折半查找法找到相应的职工姓名
2、,并输出。语言程序设计 第七章结构体共用体C语言程序设计 第七章结构体共用体C在处理此问题时,要定义两个数组在处理此问题时,要定义两个数组bx和和name ,一一个存入职工的编号,一个存放职工的姓名。个存入职工的编号,一个存放职工的姓名。如果还要增加有关职工的其它信息如年龄、性别、学历如果还要增加有关职工的其它信息如年龄、性别、学历、工资等,则均要设置相应的数组存放这些信息。、工资等,则均要设置相应的数组存放这些信息。这些信息的类型不一定相同,但它们之间是有关系的。这些信息的类型不一定相同,但它们之间是有关系的。如果用一个个独立的数组存放,则很难看出它们之间的关系如果用一个个独立的数组存放,则
3、很难看出它们之间的关系,能否将一个职工的信息作为一个完整的类型存放呢?,能否将一个职工的信息作为一个完整的类型存放呢?为了能方便地处理此类问题,在高级语言中,规定了一为了能方便地处理此类问题,在高级语言中,规定了一种新的数据类型,因为这种类型是由用户自己确定的,故称种新的数据类型,因为这种类型是由用户自己确定的,故称为用户自定义的类型,在为用户自定义的类型,在C中,这种类型被称为中,这种类型被称为结构结构。语言程序设计 第七章结构体共用体C说明:&结构体是一种构造数据类型&用途:把不同类型的数据组合成一个整体-自定义数据类型 结构体类型定义struct 结构体名结构体名 类型标
4、识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;结构成员也可称为域。成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体语言程序设计 第七章结构体共用体C例 struct student int num; char name20; char sex; int age; float score; char addr30; ; namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式,不分配内存语言程序设计 第七章结构体共用体C例:例:定义一个结构,用来存放某单位职工的编号,
5、姓名定义一个结构,用来存放某单位职工的编号,姓名,年龄,学历。,年龄,学历。语言程序设计 第七章结构体共用体C 7.2结构替类型变量的定义和引用结构替类型变量的定义和引用7.2.1定义结构体类型变量的方法定义结构体类型变量的方法语言程序设计 第七章结构体共用体C2 2、 定义时说明定义时说明语言程序设计 第七章结构体共用体C3、直接定义结构体变量、直接定义结构体变量例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 注意用无名结构体直接定义注意用无名结构体直接定义变量只能一
6、次变量只能一次语言程序设计 第七章结构体共用体C说明:说明:结构体类型与结构体变量概念不同。结构体类型与结构体变量概念不同。类型类型:不分配内存;不分配内存; 变量变量:分配内存。且占用一片连续存储单元分配内存。且占用一片连续存储单元类型类型:不能赋值、存取、运算不能赋值、存取、运算; 变量变量:可以可以结构体可嵌套结构体可嵌套结构体成员名与程序中变量名可相同,不会结构体成员名与程序中变量名可相同,不会混淆混淆语言程序设计 第七章结构体共用体C7.2.2结构变量的初始化结构变量的初始化例 struct student int num; char name20; char sex; int ag
7、e; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;语言程序设计 第七章结构体共用体C7.2.3 结构体变量的引用结构体变量的引用 引用规则 结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用引用方式: 结构体变量名.成员名例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu
8、1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ()例 struct student int num; char name20; char sex; int age; float score; char addr
9、30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2). ()语言程序设计 第
10、七章结构体共用体C7.2.4结构体的输入和输出结构体的输入和输出C语言不允许把一个结构体作为一个整体进行输入和输出操作例: struct char name15; char addr20; long num; stud=“Wang Li”,”139 Beijing Road”,89101如果输出变量stud 则为:Printf(“%s,%s,%ldn”)语言程序设计 第七章结构体共用体C7.3 结构体数组7.3.1结构体数组的定义方法三种形式:形式一:先定义结构体类型,在用它定义结构体数组。 struct student int num; char name20; char sex; int
11、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;numnamesexagenumnamesexagestu0stu125B语言程序设计 第七章结构体共用体C例 struct int num; char name20; char sex; int age; stu =,;顺序初始化:
12、 struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 例 struct student int num; char name20; char sex; int age; stu =,;分行初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Li
13、n”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化时维数可省 struct student int num; char name20; char sex; int age; str3;stu1.age+;strcpy(,”ZhaoDa”);7.3.2结构体数组的初始化结构体数组的初始化语言程序设计 第七章结构体共用体C 引用某结构体数组元素的一个成员,可用以下形式:引用某结构体数组元素的一个成员,可用以下形式: studi.n num成员名成员名序号序号数组名数组名7.3.3结构体数组的引用结构体数组的引用语言程序设计
14、 第七章结构体共用体C说明:说明:不能将结构体数组元素作为一个整体直接进行输入或不能将结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员为对象进行输入输出。输出,只能以单个成员为对象进行输入输出。例如:例如: scanf(%s, ,);); printf(%ld,%s,%d,%f, stud1.num , stud1.age, stud1.score); 语言程序设计 第七章结构体共用体C(2 2)可以将一个结构体数组元素赋值给同一结)可以将一个结构体数组元素赋值给同一结构体类型的数组中的另一个元素,或赋值给同构体类型的数组中的另一个元素,或赋
15、值给同一类型的变量。一类型的变量。例:例:structstruct stud_type student3,student1; stud_type student3,student1; 则:以下的赋值是合法的。则:以下的赋值是合法的。 student1=student0;student1=student0; student0=student1; student0=student1; student1=student1; student1=student1;语言程序设计 第七章结构体共用体C【例7.1】在在N N名毕业生中查找上海籍的学生。名毕业生中查找上海籍的学生。 #define N 3 st
16、ruct char name20; char sex3; int age; int score; char addr30; studN=“张利平张利平”,“”,“男男”,23,79,“”,23,79,“上海上海”,”, “ “钱龙钱龙”,“”,“女女”,24,85,“”,24,85,“南京南京”,”, 刘其山刘其山,男男,22,66,22,66,上海上海; 语言程序设计 第七章结构体共用体Cmain( ) int i; for(i=0;iyear p-month p-day“-”是指向结构体是指向结构体成员运算符,优先级成员运算符,优先级为一级为一级 p=&d.year语言程序设计 第
17、七章结构体共用体C 【例7.3】 :输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。 main( ) struct date / /* * 在函数中定义结构体类型在函数中定义结构体类型 * */ / int year, month, day; today,*p=&today;/ /* * 定义结构体变量及其指针定义结构体变量及其指针 * */ / printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d,&today.year,&today.month, &today.day); printf(
18、Today:%d/%d/%dn,p-year,p-month, p-day); 语言程序设计 第七章结构体共用体C7.5.2 指向结构体数组的指针 【例7.4】 :利用结构体指针输出一组化学:利用结构体指针输出一组化学 元素名称及其原子量。元素名称及其原子量。 struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218语言程序设计 第七章结构体共用体Cmain(
19、 ) struct list *p; p r i n t f ( N o t N a m e t A t o m i c Weightn); for (p=tab; p-i, p-name, p-w); tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218ppppp1 H 1.0082 He 4.00263 Li 6.9414 Be 9.01218语言程序设计 第七章结构体共用体C【例7.5】 :分析自增自减运算对程序结果的分析自增自减运算对程序结果的影响。影响。 struct code int i; char c; a =100,A,
20、200,B, 300,C,400,D;a数组100a0A200a1B300a2C400a3D语言程序设计 第七章结构体共用体Cmain( ) struct code *p=a; printf(%dt,+p-i); printf(%ct,(+p)-c); printf(%dt,(p+)-i); printf(%ct,+p-c); printf(%dt,p-i+); printf(%dn,p-i); a数组100a0A200a1B300a2C400a3Dp101301101B200D300301语言程序设计 第七章结构体共用体C形参定义为指向结构体类型的指针变量,可将形参定义为指向结构体类型的指针
21、变量,可将主调函数的结构体指针传递给被调函数的形参变量,主调函数的结构体指针传递给被调函数的形参变量,通过指针形参的指向域的扩展,操作主调函数中结构通过指针形参的指向域的扩展,操作主调函数中结构体变量及其成员。体变量及其成员。 如果将函数定义为结构体指针型函数,可利用如果将函数定义为结构体指针型函数,可利用return语句将被调函数中结构体变量的指针返回给主语句将被调函数中结构体变量的指针返回给主调函数的结构体指针变量。调函数的结构体指针变量。【例7.6】 :void input(struct student *p) scanf(%d %s %c %d.%d.%d %f, &p-num
22、, p-name, &p-sex, &p-birthday.year, &p-birthday.month, &p-birthday.day, &p-score);void main () struct student stu20; int i; for (i=0; i20; i+) input(stu+i);7.5.3用指向结构体变量的指针作函数参数用指向结构体变量的指针作函数参数语言程序设计 第七章结构体共用体C链表存储结构是一种动态数据结构,其特点是它包含链表存储结构是一种动态数据结构,其特点是它包含的数据对象的个数及其相互关系可以按需要改变,存的
23、数据对象的个数及其相互关系可以按需要改变,存储空间是程序根据需要在程序运行过程中向系统申请储空间是程序根据需要在程序运行过程中向系统申请获得,链表也不要求逻辑上相邻的元素在物理位置上获得,链表也不要求逻辑上相邻的元素在物理位置上也相邻,它没有顺序存储结构所具有的弱点。也相邻,它没有顺序存储结构所具有的弱点。 7.6.1动态存储分配和链表的概念动态存储分配和链表的概念7.6 动态存储分配动态存储分配链表链表利用结构数组,可以解决一组不同类型数据的存取利用结构数组,可以解决一组不同类型数据的存取问题。但是,利用数组,也有很多的不方便之处,如数问题。但是,利用数组,也有很多的不方便之处,如数组是静态
24、结构,在程序中事先要确定数组的大小。其次组是静态结构,在程序中事先要确定数组的大小。其次,在数组要删除一个元素,要将数组中的许多元素动位,在数组要删除一个元素,要将数组中的许多元素动位置。这些都会带来很多的不便。置。这些都会带来很多的不便。语言程序设计 第七章结构体共用体C 链表是一种动态数据结构,可根据需要链表是一种动态数据结构,可根据需要动态地分配存储单元。在数组中,插入或删动态地分配存储单元。在数组中,插入或删除一个元素都比较繁琐,而用链表则相对容除一个元素都比较繁琐,而用链表则相对容易。但是数组元素的引用比较简单,对于链易。但是数组元素的引用比较简单,对于链表中结点数据的存取操作则相对
25、复杂。表中结点数据的存取操作则相对复杂。 链表中每个元素称为一个结点。 构成链表的结点必须是结构体类型数据。 链表的基本结构 head 1000 1032 3284 1296 1382 2008 动态单向链表示意图动态单向链表示意图C3284H1296A1382I2008NNULLNULL10001032 相 邻 结 点 的 地址不一定是连续的, 依靠指针将 它们连接起来。struct nodechar c; struct node *next; ;语言程序设计 第七章结构体共用体C7.6.2用包含指针项的结构体变量构成结点struct studentchar name10; struct s
26、tudent *next; ; next为struct student类型指针变量,指向下一个结点。 结点的变量或指针变量的定义:struct student node,*head; node可以存放一个学生结点 指针head可以存放学生结点的地址。 语言程序设计 第七章结构体共用体C C语言提供了相关的存储管理库函数。这里仅介绍其语言提供了相关的存储管理库函数。这里仅介绍其中三个,它们的原型说明在中三个,它们的原型说明在“stdlib.h”头文件和头文件和“alloc.h”头文件中,使用这三个函数时,应选择其中头文件中,使用这三个函数时,应选择其中一个头文件包含到源程序中。一个头文件包含到源
27、程序中。 动态分配存储区函数malloc( ) 函数原型:void *malloc(unsigned size); 调用格式:malloc(size) 功能:在内存分配一个size字节的存储区。调用 结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返回NULL(即0)。7.6.3用于动态存储分配的函数 在ANSI C标准中,关键字void有两种用法。第一种用法,可将无返回值的函数定义为void类型第二种用法,用void * 定义指针,这是一个指向非具体数据类型的指针,称为无类型指针。 语言程序设计 第七章结构体共用体C【例7.7】调用malloc函数分配所需存储单元。 #
28、include main( ) struct st int n; struct st *next; *p; p=(struct st *)malloc(sizeof(struct st); p-n=5; p-next=NULL; printf(p-n=%dtp-next=%xn,p-n,p-next); 将函数返回值转换将函数返回值转换成结构体指针成结构体指针 语言程序设计 第七章结构体共用体C 动态分配存储区函数calloc( ) 函数原型: void *calloc(unsigned int n,unsigned int size); 调用格式:calloc(n,size) 功能:在内存分
29、配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。语言程序设计 第七章结构体共用体C【例7.8】调用calloc函数分配所需存储单元。 #include main( ) int i,*ip; ip=(int *)calloc(10,2); for (i=0; i10; i+) scanf(%d,ip+i); for (i=0; iname,name) gets(p-tel) p-next=NULL h=NULL T F h指向第一个指向第一个 连接新结点连接新结点 结点结点 h=p q-next=p q指向新的尾结点指
30、向新的尾结点 q=p 读入一个学生姓名读入一个学生姓名图图9.3 建立单向链表建立单向链表NULLhpChang62783410NULLWang63212986NULLpq 7.6.4链表应用举例:链表应用举例:语言程序设计 第七章结构体共用体C strcpy(p-name,name); /* 为新结点中的成员赋值 */ printf(tel: ); gets(p-tel); p-next=NULL; if (h=NULL) /* h为空,表示新结点为第一个结点 */ h=p; /* 头指针指向第一个结点 */ else /* h不为空 */ q-next=p; /* 新结点与尾结点相连接 *
31、/ q=p; /* 使q指向新的尾结点 */ printf(name: ); gets(name); return h; struct node *create( ) static struct node *h; struct node *p,*q; char name20; h=NULL; printf(name: ); gets(name); while (strlen(name)!=0) /* 当输入的姓名不是空串循环 */ p=NEW; /* 开辟新结点 */ if (p=NULL) /* p为NULL,新结点分配失败 */ printf(Allocation failuren); e
32、xit(0); /* 结束程序运行 */ #include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;main( ) struct node *head; head=create( ); 语言程序设计 第七章结构体共用体C【例7.10】输出学生电话簿链表函数。hpChang62783410Li68752341NULLWang63212986 p指向第一个结点指向第一个结点 p=head 当当p不为不为NULL 输出
33、结点数据输出结点数据 p指向下一个结点指向下一个结点 p=p- -next图图9.5 输出链表的输出链表的N-S图图pppNULLNULL语言程序设计 第七章结构体共用体Cvoid prlist(struct node *head) struct node *p; p=head; while (p!=NULL) printf(%st%sn,p-name,p-tel); p=p-next; #include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; str
34、uct node *next; ;main( ) struct node *head; head=create( ); prlist(head); 语言程序设计 第七章结构体共用体C 在链表中,如果要删除第i个结点,一般是将第(i-1)个结点直接与第(i+1)个结点相连接,然后再释放第i个结点的存储单元 。hNULLNULL第第i-1个结点个结点 第第i个结点个结点 第第i+1个结点个结点 语言程序设计 第七章结构体共用体C 【例7.11】删除学生电话簿链 表中指定学生的信息。 p=head while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) q
35、指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) strcmp(x,p-name)=0 T F p=head T F head=p-next q-next=p-next 没找到没找到 free(p)图图9.9 删除链表中指定结点的删除链表中指定结点的N-S图图删除删除第一个第一个结点结点 删除中间删除中间结点或尾结点或尾结点结点 删除结点工删除结点工作分两步:作分两步:查找结点查找结点删除结点删除结点学生姓名学生姓名当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环语言程序设计 第七章结构体共用体ChpChang62783410Li68752341NULLWan
36、g63212986(a) 删除第一个结点 (head=p-next)语言程序设计 第七章结构体共用体ChpChang62783410Li68752341NULLWang63212986(b) 删除中间结点或尾结点 (q-next=p-next)p q语言程序设计 第七章结构体共用体ChpChang62783410Li68752341NULLWang63212986pp(c) 未找到指定的结点 (strcmp(x,p-name)!=0) qq 语言程序设计 第七章结构体共用体C if (strcmp(x,p-name)=0) if (p=head) head=p-next; /* 删除头结点 *
37、/ else q-next=p-next; /* 删除中间或尾结点 */ free(p); /* 释放被删除的结点 */ else printf(Not found.); /* 未找到指定的结点 */ h=head; return h;#include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;struct node *delnode(struct node *head, char *x) struct node
38、*p,*q; static struct node *h; if (head=NULL) printf(This is a empty list.); /* 空链表情况 */ return head; p=head; while (strcmp(x,p-name)!=0 & p-next!=NULL) q=p;p=p-next; /* q指针尾随p指针向表尾移动 */查找结点查找结点 语言程序设计 第七章结构体共用体C 将一个新结点插入到链表中,首先要寻找插入的位置。如果要求在第i个结点前插入,可设置三个工作指针p0、p和q,p0是指向待插入结点的指针。利用p和q指针查找第i个结点,找
39、到后再将新结点链接到链表上。 hNULLNULL第第i个结点个结点ppqqp0p新的第新的第i个结点个结点语言程序设计 第七章结构体共用体C head=NULL T F p=head head=p0 while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) p0-next q指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) =NULL NULL strcmp(x,p-name)=0 T F p=head T F p-next=p0 head=p0 q-next=p0 p0-next=NULLNULL p0-next=p图图9.
40、11 在链表指定位置前插入结点的在链表指定位置前插入结点的N-S图图 【例7.12】在学生电话簿链表中插入一个学生的信息。要求将新的信息插入在指定学生信息之前,如果未找到指定学生,则追加在链表尾部。 当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环空表时空表时插入插入结点结点在表尾在表尾追加结点追加结点 插入结点工插入结点工作分两步:作分两步:查找插查找插入位置入位置连接连接新结点新结点在表头在表头插入结点插入结点 在表中间在表中间插入结点插入结点 语言程序设计 第七章结构体共用体ChpChang62783410Li68752341NULLWang63212986(a) 在表头插入结点
41、 (head=p0; p0-next=p)Zhao62758421p0语言程序设计 第七章结构体共用体ChChang62783410Li68752341NULLWang63212986(b) 在表中间插入结点 (q-next=p0; p0-next=p)pqZhao62758421p0语言程序设计 第七章结构体共用体ChpChang62783410Li68752341NULLWang63212986pp(c) 在表尾追加结点 (p-next=p0; p0-next=NULL) qq Zhao62758421p0Zhao62758421NULL语言程序设计 第七章结构体共用体C if (strc
42、mp(x,p-name)=0) if (p=head) head=p0; /* 在表头插入结点 */ else q-next=p0; /* 在表中间插入结点 */ p0-next=p; else p-next=p0; /* 在表尾插入结点 */ p0-next=NULL; h=head; return h; struct node *insert(struct node *head, struct node *p0, char *x) struct node *p,*q; static struct node *h; if (head=NULL) head=p0; /* 空表时,插入结点 */
43、 p0-next=NULL; else p=head; while (strcmp(x,p-name)!=0 & p-next!=NULL) q=p;p=q-next; 查找插入点查找插入点 #include #include #define NEW (struct node *)malloc(sizeof(struct node)struct node char name20,tel9; struct node *next; ;语言程序设计 第七章结构体共用体C【例7.13】学生电话簿链表管理程序。 编制此程序可利用以上的4个函数完成链表的建立、输出、删除和插入等功能,这里只需编制一
44、个main函数完成对这4个函数的调用。 #include #define NEW (struct node *)malloc(sizeof(struct node) struct node char name20,tel9; struct node *next; ;语言程序设计 第七章结构体共用体Cmain( ) struct node *create( ),*delnode(struct node *, char *); struct node *insert(struct node *, struct node *, char *); void prlist(struct node *);
45、 struct node *head=NULL,*stu; char s80,name20; int c;语言程序设计 第七章结构体共用体Cdo do printf(n * * * * MENU * * * * n); printf( 1. Create a list n); printf( 2. Print a list n); printf( 3. Delete a node n); printf( 4. Insert a node n); printf( 0. Quit n); printf( Enter your choice(0-4): ); gets(s); c=atoi(s);
46、while(c4); 可以先选择可以先选择1 1建建立一个链表,然立一个链表,然后根据需要选择后根据需要选择功能功能2 2、功能、功能3 3、功能功能4 4、直到选、直到选择择0 0退出程序的退出程序的运行运行 语言程序设计 第七章结构体共用体C switch(c) case 1: head=create( ); break; case 2: prlist(head); break; case 3: printf(nInput a name deleted:n); gets(name); head=delnode(head,name); break; case 4: stu=NEW; prin
47、tf(nInput a new noden); printf(name: ); gets(stu-name); printf(tel: ); gets(stu-tel); stu-next=NULL; printf(nInsert positionn); printf(name: ); gets(name); head=insert(head,stu,name); while (c);语言程序设计 第七章结构体共用体C 结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。 在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。
48、一种构造类型数据一种构造类型数据 共用体共用体由若干不同类型的数据项组成,由若干不同类型的数据项组成, 构成共用体的各个数据项称为构成共用体的各个数据项称为共用体成员共用体成员。7.7共同体类型数据共同体类型数据语言程序设计 第七章结构体共用体C union 共用体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n; ;共用体类型定义的一般形式: lunionunion为关键字;为关键字;l共用体名共用体名是用户定义的是用户定义的类类型标识型标识。l 中是组成该共用体的中是组成该共用体的成员成员。成员的。成员的数据类型数据类型可可以是以是C语言所允许的任何语言所允许的任何
49、数据类型数据类型。语言程序设计 第七章结构体共用体C例如: union utype int i; char ch; long l; char c4; ; 定义了一个定义了一个union union utypeutype共用体共用体类型,共用体类型定义不分配内存类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成空间,只是说明此类型数据的组成情况。情况。 语言程序设计 第七章结构体共用体Cu1变量chu1变量iu1变量l1. 共用体变量的定义 利用已定义的共用体类型名定义变量 union 共用体名 变量名表;例如: union utype u1,u2; 按照共用体类型的组成,系统为定义的
50、共用体变量分按照共用体类型的组成,系统为定义的共用体变量分配内存单元。配内存单元。共用体变量共用体变量所占内存所占内存共用体中占用共用体中占用内存的内存的长度最长的成员长度最长的成员。u1变量cc0c1c2c3语言程序设计 第七章结构体共用体C 在定义共用体类型的同时定义变量例如: union utype int i; char ch; long l; char c4; a, b, c; union 共用体名 成员定义表; 变量名表;语言程序设计 第七章结构体共用体C 直接定义共用体类型变量 例如: union int i; char ch; long l; char c4; a, b, c;
51、 union 成员定义表; 变量名表;语言程序设计 第七章结构体共用体C2. 共用体变量的运算 用sizeof运算符计算共用体变量所占内存空间 union utype int i; char ch; long l; char c4; a, b, c; sizeof(a) 的结果为4 sizeof(union utype) 的结果为4 语言程序设计 第七章结构体共用体C 同类型共用体变量之间的赋值运算 共用体变量之间进行赋值时,系统仅赋当前有效成员的值(即最新存储的数据)。 union utype int i; char ch; long l; char c4; a, *p=&a; 对共
52、用体变量进行取址运算语言程序设计 第七章结构体共用体C3. 共用体变量成员的引用 共用体变量成员的引用有三种形式。例如: union u char u1; int u2; x,*p=&x;语言程序设计 第七章结构体共用体C4. 共用体变量赋初值 【例7.14】 :共用体变量赋初值。 union u char u1; int u2; ; main( ) union u a=0 x9741; printf(1. %c %xn,a.u1,a.u2); a.u1=a; printf(2. %c %xn,a.u1,a.u2); 共用体类型变量在定义时只能对第一共用体类型变量在定义时只能对第一个成
53、员进行赋初值。个成员进行赋初值。 由于第一个成员是字符型,用一个字由于第一个成员是字符型,用一个字节,所以对于初值节,所以对于初值0 0 x9741x9741仅能接受仅能接受0 0 x41x41,初值的高字节被截去。初值的高字节被截去。 1. A 41A 412. a 61a 61对对u2u2成员的引成员的引用是无意义的用是无意义的语言程序设计 第七章结构体共用体Cmain( ) union long n; int k; char c; un; un.n=0 x12345678; printf(%lxn,un.n); printf(%xn,un.k); printf(%xn,un.c); un
54、.c=A; printf(%ldn,un.n); printf(%dn,un.k); printf(%cn,un.c); 1234567856787830541984122081A0 x780 x560 x340 x12低地址低地址高地址高地址0 x120 x340 x560 x410001 001000110100 010101100100 0001高地址高地址低地址低地址语言程序设计 第七章结构体共用体C例如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; enum color1 blue, green, red ; enum flag
55、false, true ;7.8 枚举类型数据1. 枚举类型的定义 枚举类型定义的一般形式: enum 枚举名 枚举常量取值表 ; 枚举枚举是一个具有有限个是一个具有有限个整型符号常量的整型符号常量的集合集合,这些整型符号常量称为枚举常量。,这些整型符号常量称为枚举常量。 每个枚举类型都必须进行类型的定义,每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。以便限定此枚举类型变量的取值范围。 语言程序设计 第七章结构体共用体C 在枚举类型中,每个在枚举类型中,每个枚举常量枚举常量都代表一都代表一个整型值
56、。在定义枚举类型的同时可隐式或个整型值。在定义枚举类型的同时可隐式或显式地显式地定义枚举常量所代表的值定义枚举常量所代表的值。 例如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ;2. 枚举常量的整型值 隐式定义: 按照类型定义时枚举常量列举的顺序分别代表0、1、2、等整型值。 0123456语言程序设计 第七章结构体共用体C例如: enum op plus=43,minus=45,multiply=42,divide=47 ; enum workday Mon=1,Tue,Wed,Thu,Fri ;显式定义: 在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的值依次递增1。 2345语言程序设计 第七章结构体共用体C例如: enum flag fg; enum color1 c1; enum color2 blank,brown,yellow,white c2; enum lightblue,lightgreen,lightred c3;3. 枚举变量的定义 枚举类型变量定义的三种形式: enum 枚举名 枚举变量名表; enum 枚举名 枚举常量取值表枚举变量表; enum 枚举
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年耕地租赁合同
- 广告设备购销合同2024年
- 合伙企业协议格式
- 房地产代理销售协议书2024年
- 服装制造商合作合同
- 2024年二手房屋买卖合同范例
- 担保合作协议填写指南
- 合伙餐馆协议书样本专业
- 装修预算合同范本2024年
- 2024设备搬迁运输合同
- 银行营销策略市场调研分析
- 2024年房地产公司设计类技术笔试历年真题荟萃含答案
- 雾化吸入依从性品管圈课件
- 生活场景下信息检索
- 【城市社区韧性治理探究文献综述4800字】
- 教科版六年级科学上册全册同步练习附答案
- 2024年《大学语文》期末考试复习题库(含答案)
- 职业健康风险评估数据(井仔)
- 蜂蛰伤急救护理课件
- 学习不是唯一出路
- 民航行业应急管理体系建设
评论
0/150
提交评论