第八章结构体与共用体【教学要求】1.理解结构体的含义。2.掌握结构体类型变量的定义方法。3.掌握结构体类型变量的引用方法。4.掌握结构体类型变量如何在定义的同时初始化。5.理解共同体的含义,掌握共同体类型变量的定义方法。6.了解结构体数组的定义和数组元素的引用。7.了解指向结构体类型数据的指针的概念及使用。8.了解链表结点的结构形式,链表的基本操作。9.了解枚举类型的定义,及枚举类型的输入输出。10.了解TYPEDEF的作用。第八章结构体与共用体1.结构体(struct)2.共同体(union)3.结构体与共用体小结4.枚举类型(enum)5.typedef定义类型结构体(struct)1.结构体的概念2.结构体数组3.结构体指针结构体的概念1.结构体的定义2.结构体变量的存储特点3.结构体变量的引用4.结构体的初始化结构体的定义1、含义:不同类型数据的集合。2、功能:用于描述一个“概念”。(或记录)如:numnamesexagescoreaddr10010LiFunM1887.5BeiJing3、定义方法:方法一:在定义结构体类型的同时,直接给出结构体变量。如:struct结构体名{结构体成员变量的定义;}变量名1,变量名2,...,变量名n;方法二:先给出结构体类型的定义,再定义结构体变量。如:struct结构体名{结构体成员变量的定义;例:};struct结构体名变量名1,变量名2,...,变量名n;4、要点:方法二:structstudent{intnumber;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstudent1,student2;方法一:structstudent{intnumber;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;请注意两种方法的不同特点:1、“;”的用法;2、方法二可以用一个*.h文件来存储结构体的定义。4、要点:结构体名(struct):用于标识一种新的数据类型,即结构体类型,可以省略。注意区分结构体类型与基本数据类型的不同,它是复合数据类型。结构体成员变量与普通变量的定义一样,它还可以是结构体变量。structdate{intmonth,day,year;};structstudent{intnum;charname[20];charsex;intage;structdatebirthday;charaddr[30];}student1,student2;结构体变量的存储特点如:structstudent{intnumber;charname[5];charsex;intage;floatscore;charaddr[10];}student1,student2;structstudent所占存储空间的大小为:各成员变量所占存储单元字节数之和。sizeof(student)student1.numberstudent1.name[0]...student1.name[4]student1.sexstudent1.agestudent1.scorestudent1.addr[0]...student1.addr[9]student2.numberstudent2.name[0]...student2.name[4]student2.sex...student1student2结构体类型变量的引用一、原则:通过结构体的成员来引用结构体变量。二、成员的引用方法为:结构体变量名.成员名三、要点:1.结构体变量不能整体输入输出,只能对它的成员进行操作。如:student1.num;2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成员。如:student1.birthday.day3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符。4.可以引用成员的地址。结构体变量的初始化一、只可以给主函数中或外部存储类别和静态存储类别的结构体变量、数组赋初值。1、对外部存储类型的初始化.2、对静态存储类型的结构体变量进行初始化二、给结构体变量赋初值不能跨越前面的成员而只给后面的成员变量赋值。例exp8_1:对外部存储类型的初始化.structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a={99641,”LiPing”,’M’,56,”TianjinStreet”};main(){couta.num““a.name““a.sex““a.addr;}例exp8_2:对静态存储类型的结构体变量进行初始化.main(){staticstructstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a={99641,”LiPing”,’M’,56,”TianjinStreet”};couta.num““a.name““a.sex““a.addr;}结构体数组1.结构体数组的含义:数组元素是结构体类型数据的数组称为结构体数组。2.结构体数组的定义3.结构体数组的初始化4.结构体数组的应用举例结构体数组的定义一、含义:若干个相同的结构体类型变量组成的数据集合。二、定义方法:struct结构体名{例如:结构体成员定义;}数组名[元素个数];三、结构体数组的使用方法1、通过数组的下标(或指向数组的指针)来访问结构体变量。2、再通过结构体变量的成员实现结构体数据的访问。形式为:数组名[下标].成员名如:stu[2].name=“WangYing”;structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu[3];structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}stu[3];结构体数组的物理含义:表示实体(或记录)的个数。1、含义:在定义结构体数组时完成数组元素的赋值2、方法:与一般数组元素赋初值的方法相同。structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a[3]={{99641,”LiPing”,’M’,56,”TianjinStreet”},{99341,”ZhangFan”,’F’,78,”BeijingRoad”},{99441,”RenZhong”,’M’,34,”ShenyangRoad”}};结构体数组的初始化例exp8_3:对候选人得票的统计程序,设有三个候选人,每次输入一个候选人的名字,最后统计出每个候选人的得票的结果.structperson{charname[20];intcount;}leader[3]={“Li”,0,”Zhang”,0,”Fun”,0};main(){inti,j;charleader_name[20];for(i=1;i=10;i++){cinleader_name;for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}coutendl;for(i=0;i3;i++)coutleader[i].name““leader[i].countendl;结构体指针1.指向结构体变量的指针2.指向结构体数组的指针3.指向结构体的指针作函数的参数4.单链表指向结构体变量的指针一、含义:1、结构体变量的指针:指结构体变量所占内存单元的起始地址2、指向结构体变量的指针指向结构体变量的起始地址的指针变量.二、定义方法与使用三、要点:1、必须将指针指向一个确定的结构体变量,如:p=&a;2、通过结构体变量的指针访问结构体的方法为:a.num、(*p).num、p-num。3、区分下面的两种用法:p-n++和++p-n1、结构体指针的定义:main(){structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a={070441,”LiPing”,’M’,56,”TianjinStreet”},*p=&a;2、结构体指针的使用:a.num,a.name,a.sex,a.addr(*p).num,(*p).name,(*p).sex,(*p).addr;p-num,p-name,p-sex,p-addr;指向结构体数组的指针1、定义方法举例:2、使用要点:p++:是指针p指向数组的下个元素,而这个元素是由结构体类型数据组成的,它不是一个简单的变量.(++p)-num:先使指针p指向结构体数组当前位置的下一个元素,再访问其元素成员num;请区别与(p++)-num的不同。例exp8_4:指向结构体数组的指针structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}a[3]={{070441,”LiPing”,’M’,56,”TianjinStreet”},{070442,”ZhangFan”,’F’,78,”BeijingRoad”},{070443,”RenZhong”,’M’,34,”ShenyangRoad”}};main(){structstudent*p;for(p=a;pa+3;p++)coutp-nump-namep-sexp-agep-scorep-addr;}指向结构体的指针作函数的参数1、用结构体变量的成员作函数的参数与一般变量作函数的参数一致;2、用指向结构体变量的指针作函数的参数,实参将地址传递给形参,与前面指针作函数参数一致;3、新版本的c语言允许将整个结构体变量作为函数的参数进行传递,要求形参与实参的类型必须一致,而且程序占用内存大,运行速度慢.单链表一、链表的含义:当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构。举例:二、链表操作建立链表、在链表插入结点、删除链表结点单链表的结构:structstudent{intnum;floatscore;structstudent*next;};要点:1、链表中的元素在内存中存放顺序是不连续的。由next指针来连接各节点。2、链表数据结构的实现,必须利用指针变量.headnumscorenextnumscorenextnumscoreNULL...节点建立含n个节点的链表过程:headnumscorenextnumscorenextnumscoreNULL...structstudent*creat(){structstudent*head,*p1,*p2;n=0;head=NULL;p1=p2=newstudent;cinp1-nump1-score;while(p1-num!=0){n=n+1;if(n==1)head=p1;elsep2-next=p1;p2=p1;p1=newstudent;cinp1-nump1-score;}p2-next=NULL;return(head);}在链表中插入结点的过程...headnumscorenextnumscorenextnumscoreNULLnumscorenext