《结构与联合》PPT课件.ppt
第七章 结构与联合,构造类型二,结构和联合的概念,在数据中,经常有一些既有联系,类型又不同的数据,它们又需要一起处理。,如:学生基本档案的数据,字段:学号 姓名 性别 地址 分数类型:long char char char float,C语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型,即结构和联合。,结构和联合的操作分为三个步骤:,根据需要定义结构或联合类型;通过定义的类型说明变量、数组、指针;引用变量、数组元素和指针指向的对象。,7.1 结 构,结构类型的定义,格式:,struct 结构名 type 成员1;type 成员2;type 成员n;;,结构标志。,用标识符命名的结构类型名。,结构类型中所含的成员项及其类型。,struct student long num;char name20;int age;char add30;float score;,结构的定义确定了如下两点:,定义结构类型,确定结构中的成员项的名称及类型。,指明该结构类型的变量在内存中的组织形式。,结构变量的说明,定义结构只是确定该结构类型的名称及其成员项的组成及成员项的类型。必须由定义的结构类型说明结构变量,才开辟相应的内存空间以供使用。,结构变量的说明方式:,定义后说明,struct student long num;char name20;int age;char add30;float score;,struct student wang,zhang,liu;,用struct student 类型说明三个变量。,定义结构类型时说明变量,wang,zhang,liu;,无名结构方式说明变量,struct long num;char name20;int age;char add30;float score;wang,zhang,liu;,说明:,注意类型和变量的区别。成员项可单独使用。wang.age=20结构的成员项也可以是结构变量。,struct doc char name20;struct birth age;float sal;struct birth int year;int mon;int day;,结构doc中的成员项是一个birth的结构变量!,结构变量的引用,结构变量都是以成员项作为引用单位,引用方式:,结构变量名.成员项名,wang.score=100;,说明:,结构变量的成员项与普通变量有相同的性质。,结构体变量的初始化,结构变量可以在说明时赋初值,称为初始化。,static struct student long num;char*name;char sex3;int age;float score;char addr 30;wang=99010101,“王五”,“男”,20,90.5,“上海”;,结构数组,结构变量也可以构造成数组,称为结构数组。每个数组元素都是一个结构变量,都含有结构成员项。它们在内存中的地址是连续的。,数组的说明:,struct 结构名 结构数组名 常量表达式;,struct student long num;char name20;float score;stud3;,说明:,三个结构数组元素都含有student 的成员项。结构数组名stud,代表结构数组的首地址。外部和静态结构数组在说明时可以初始化。,=99010101,“wang”,67.5,99010102,“zhao”,78.5,99010103,“fun”,98.5;,举例:统计三个候选人的票数。,#include#define NUMBER 10struct student int num;char name20;int count;lead3=1,“fun”,0,2,“tan”,0,3,“wang”,0;void main(void)int i,j,numb;for(i=0;i0)leadnumb-1.count+;else printf(“Selection errorn”);printf(“n”);for(i=0;i3;i+)printf(“%5s:%dn”,leadi.name,leadi.count);,定义结构说明数组并初始化。,循环输入统计票数,输出结果。,chp7ex1,结构指针,概念:指向结构变量首地址的指针称为结构指针。结构指针加一,地址加一个结构变量所占的字节。,结构指针的应用:,先说明结构指针 struct student*p,stu1;,指向结构的指针。,指针指向同类型的结构变量或数组。p=,通过指针引用指针指向变量的成员项,引用方式为:,方式一:(*p).成员项名方式二:p-成员项名,结构指针主要用于对结构数组操作。,struct studoc int iNum;char*name;*p,wang=2001,”wang li”;p=,举例:,#include struct sam int num;char name20;char*addr;ws=101,“fun”,“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);,定义结构,说明数组并初始化。,说明结构指针。,指针指向结构数组。,通过指针引用成员项。,chp7ex2,结构与函数参数,当函数需要通过形参传递一个结构时,一般有两种处理办法:,传递一个结构指针(效率高)。,#includevoid mprintp(struct student*);struct student long num;char*name;float score;void main()struct student s1;s1.num=99010101;s1.name=“wang hai”;s1.score=99;mprintp(,指向结构的指针。,传递一个结构变量(效率低)。,void mprintp(struct student);,s1,struct student sv,sv.num,sv.name,sv.score,结构变量。,返回结构变量的函数,当函数的返回值为一个结构变量时,称该函数为一个结构型函数。,#includestruct stu long num;char name10;float score;struct stu sv(void);void main(void)struct stu ws;ws=sv();printf(“%ldn%sn:%fn”,ws.num,ws.name,ws.score);struct stu sv(void)struct stu stemp;gets(stemp.name)scanf(“%ld,%f”,chp7ex3,返回结构指针的函数,当函数的返回值为一个结构指针时,称该函数为一个结构指针型函数。,#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;int i;struct stu*sap;printf(“Enter the number:”);scanf(“%ld”,struct stu*findp(long number)int i;for(i=0;sa i.num!=0;i+)if(sa i.num=number)break;return(,思考题,已知某班有6个人参加数学和物理竞赛的集训和课程考试,求:两门课程中的最高成绩,及对应的姓名、学号和课程编号。课程1,2的平均成绩,并求出两门课程都低于平均成绩的学生姓名和学号。对编号1的课程从高到低排序。(注意,其他成员项应保持对应关系)。说明:要求定义结构,第一成员项为学生姓名,第二成员项为学号,另外两个成员项为两门课成绩。、要求分别用函数完成。检查某位同学两门课程成绩分别排第几名。,7.2 链 表,引用自身的结构和链表的概念,结构中的某个成员项,为指向该结构类型自身的指针,则称为引用自身的结构。,struct student int num;float score;char*name;struct student*next;,指向自身的结构。,相同类型的结构指针。,链表是一种动态存储分配结构,通过指针相连,数据可以不连续存放。,head,结构变量,NULL,链表,head,2000H,2000H,2400H,2400H,NULL,tail,内存分配函数,链表的操作需要开辟内存单元以便插入或追加节点,删除节点后需要释放节点占用的内存单元。C 语言提供了相应的函数。,malloc函数,使用方法:ptr=malloc(size);,分配内存的字节数。,返回空类型的指针。成功:返回内存的地址。失败:返回NULL。,void*ptr;ptr=mallc(sizeof(int),ptr,void free(ptr),作用:释放ptr指向的由malloc分配的内存空间。,链表的操作,建立链表,步骤:定义引用自身的结构。说明指向结构的指针,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(sizeof(struct slist);head-nextp=NULL;,headtail,NULL,while(c=getchar()!=n)tail=append(tail,c);,在尾部追加节点,步骤:为新节点分配内存。建立新节点的成员项。建立链接关系。,struct slist*append(struct slist*ptr,char c)struct slist*p;p=(struct slist*)malloc(sizeof(struct slist);p-info=c;p-nextp=NULL;ptr-nextp=p;return(p);,headtail,NULL,p,NULL,tail,tail,删除节点函数,void cdelete(struct slist*pcdel)struct slist*p;p=pcdel-nextp;pcdel-nextp=pcdel-nextp-nextp;free(p);,p,思考题:编写一个函数,在当前指针位置插入节点。,7.3 联 合(union),概念:不同数据类型的集合;每个成员项共用一段内存空间;某一时刻只能对一个“活的active”成员项操作;,联合类型的定义,格式:,union 联合名 type 成员项 1;type 成员项 2;type 成员项 n;,union exam int a;float b;char c;,联合变量的说明和引用,可以用联合类型说明:联合变量、联合数组、指向联合指针。,union exam x,*px,y10;,引用:引用变量的成员项。,通过变量引用:变量名.成员项名通过指针引用:指针-成员项名,联合与结构的区别,struct exam int a;float b;char c;x;,x,a,b,c,union exam int a;float b;char c;x;,x,b,a,c,结构变量的每个成员项有独立的内存单元,而联合变量的成员项以最大的成员项开辟单元后,所有成员项共用单元。,sizeof(struct exam),举例:,#include void main(void)union exam int i;char ch2;x;x.i=24897;printf(“i=%xHn”,x.i);printf(“ch0=%xH,ch1=%xHn”,x.ch0,x.ch1);printf(“ch0=%c,ch1=%cn”,x.ch0,x.ch1);,chp7ex4,7.4 枚 举,概念:有限状态的集合,以整型值代表。如:月份,星期。,枚举类型的定义,enum 枚举类型名 枚举元素表;,enum daysun,mon,tue,wed,thv,fri,sat;,说明:,枚举元素如果不赋值,自动取0n-1整数值;,在定义时,可以对某个枚举元素赋值,其后的元素按此值,自动加一递增。,枚举变量的说明和引用,enum day day1,day2;,枚举变量只能取该类型中的一个元素。,day1=sat;,day2=(enum day)2;,7.5 用户定义类型,C 语言可以通过 typedef 语句,定义自己命名的数据类型。实际上是给 C 类型重新起个名字。,typedef语句的格式:,typedef type 标识符;,C语言的类型名。,用户定义类型名。,引用方式:,基本类型,typedef int INTEGER;INTEGER a,b;,数组,typedef char STRING41;STRING a,b;char a41,b41;,结构或联合,typedef struct char name30;long num;float csore;PERSONDOC;PERSONDOC a,b,*p;,