您好,欢迎访问三七文档
第10章构造数据类型本章要点理解结构体的含义、定义与使用方法理解共用体的含义、定义与使用方法理解枚举类型的含义、定义与使用方法理解typedef的作用与使用方法掌握链表操作的基本方法本章难点有关链表的操作用结构体变量和指向结构体的指针作函数参数10.1概述有时,需将不同类型的数据组合成一个有机的整体,以便于引用。这些数据是相互联系的。如一个学生的有关信息:numnamesexageaddr10010LiminM18Dalian可采用结构体数据结构描述上述信息。10.1结构体例如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};定义一个结构体类型的一般形式为:struct结构体名{成员表列};对各成员都要进行类型说明;成员名定名规则与变量名同。是类型,不是变量名10.1.2定义结构体类型变量的方法方法一:先定义结构体类型再定义变量名structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstudent1,student2;定义studet1和sudent2为structstudent类型变量不能只指定一个变量为“struct型”而不指定结构体名•有时,可用符号常量代表一个结构体类型,如:#defineSTUDENTstructstudentSTUDENT{intnum;charname[20];charsex;intage;charaddr[30];};这样,可直接用STUDENT定义变量,如:STUDENTstudent1,student2;此时,不必再写关键字struct方法二:在定义类型的同时定义变量,如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}student1,student2;一般形式是:struct结构体名{成员表列}变量名表列;方法三:直接定义结构类型变量。其一般形式是:struct{成员表列}变量名表列;此时,不出现结构体名几点说明:1.类型与变量是不同概念,不要混淆;2.结构体中的成员,可以单独使用,其作用与地位相当于普通变量;3.成员也可以是一个结构体变量;例如:structdate{intmonth;intday;intyear;};Structstudent{intnum;charname[20];intage;structdatebirthday;}student1,student2;4.成员名可以与程序中的变量名相同,二者不代表同一对象。10.1.3结构体类型变量的引用规则:1.不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出(引用形式为:结构体变量名.成员名)。printf(“………..”,student1);printf(“%d”,student1.num);输出10010错!正确!2.若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。如:student1.birthday.year(下页续)(接上片)3.对成员变量可以象普通变量一样进行各种运算,如:sumage=student1.age+student2.age;4.可以引用成员的地址,也可以引用结构体变量的地址,如scanf(“%d”,&student1.num);printf(“%o”,&student1);scanf(“%d,%s,%c,%d,%s”,&student1);错!输入student1.num的值输出student1的首地址10.1.4.结构体变量的初始化(一)对外部存储类型的结构体变量初始化:structstudent{longintnum;charname[20];charsex;charaddr[20];}a={9801,”Wanghong”,’W’,”2LinggongRoad”};main(){printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name,a.sex,a.addr);}运行结果为:No.:9801name:Wanghongsex:Waddress:2LinggongRoad(二)对静态存储类型的结构体变量初始化,如:main(){staticstructstudent{longintnum;charname[20];charsex;charaddr[20];}a={9801,”Wanghong”,’W’,”2LinggongRoad”};printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name,a.sex,a.addr);}10.1.5结构体数组(每个数组元素都是一个结构体类型的数据)(一)结构体数组的定义,如structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudntstu[3];也可直接定义,如structstudent{intnum;…}stu[3];或struct{intnum;…}stu[3];(二)结构体数组的初始化(只能对全局的或静态存储类别的数组初始化)structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu[3]={{111,”Li”,’M’,18,”Dalian”},{…},{…}};也可采用:structstudent{intnum;…};structstudentstu[]={{…},{…},{…}};结构体数组的初始化的一般形式是在定义数组后面加上:={初值表列};例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。structperson{charname[20];intcount;}leader[3]={“Li”,0,”zhang”,0,”Liu”,0};main(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(“%s”,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++);}for(i=0;i3;i++)printf(“%5s:%d\n”,leader[i].name,leader[i].count);}10.1.6指向结构体类型数据的指针结构体变量的指针:是该结构体变量所占居的内存段的起始地址。例如:main(){structstudent{longintnum;charname[20];charsex;};structstudentstu_1;structstudent*p;p=&stu_1;stu.num=9901;strcpy(stu_1.name,”LiMin”);stu_1.sex=‘W’;printf(“No.:%ld\nname%s\nsex:%c\n”,stu_1.num,stu_1.name,stu_1.sex);printf(“\nNo.:%ld\nname%s\nsex:%c\n”,(*p).num,(*p).name,(*p).sex);}引用结构体成员的三种形式:结构体变量名.成员名(*p).成员名p-成员名指向运算符。其优先级高于自增、自减运算符试分析以下运算:p-n得到p指向的结构体变量中的成员n的值p-n++得到p指向的结构体变量中的成员n的值,用完后使它加1;++p-n得到p指向的结构体变量中的成员n的值使其先加1和普通变量一样,结构体变量也可以作为函数参数,用于在函数之间传递数据。同时,函数的返回值也可以是结构变量。10.2.1结构变量与数组结构作函数参数结构变量作函数参数的传递方式与简单变量作函数参数的处理方式完全相同,即采用值传递的方式,形参结构变量中各成员值的改变,对相应实参结构变量不产生任何影响,但在函数定义时需要对其类型进行相应的说明。如:intget_month(x)structmonthx;{…x.day=25;…}它说明了形参x是structmonth型结构变量。10.2共用体10.2.2结构变量作为函数的返回值结构变量也可以作为函数的返回值,这时在函数定义时,需要说明返回值的类型为相应的结构类型。例如:structdatafunc(n)floatm;{structdataf;…return(f);}其中,函数名func前面的类型说明符就是用于对函数返回值f的类型进行说明。10.3结构体与指针10.3.1结构体变量指针结构体变量指针是指向结构体变量的指针。结构体变量指针的一般定义格式为:struct结构体类型名*结构体变量名;例如:structstudent{floatave;}stu1;structstudent*pa;定义stu1是类型为structstudent的结构体变量,pa是可以指向该类型对象的指针变量。但应该注意的是:经过上面的定义,此时pa尚未指向任何具体的对象。为使pa指向stu1,必须把stu1的地址赋给pa:pa=&stu1;注意,在定义了*pa之后,应该知道:(1)*pa不是结构变量,因此不能写成pa.ave,必须加上圆括号(*ps).ave。为此,C语言引入一个指向运算符“–”,连接指针变量与其指向的结构体变量的成员。“–”为间接成员运算符,其一般引用的格式为:指针变量名–结构成员名说明:运算符“–”是由连字符和大于号组成的字符序列,它们要连在一起使用。C语言把它们作为单个运算符使用。所以我们可以将(*ps).ave改写为ps–ave。(2)pa只能指向一个结构体变量,而不能指向结构体变量中的一个成员。(3)指向运算符“–”的优先级别最高,10.3.2结构体数组指针我们知道,数组和指针有密切的关系。同样,结构数组和结构数组指针也紧密相关。当定义一个结构数组后,我们还可以定义一个结构指针变量,使该指针变量指向这个数组。那么,程序中既可以利用数组下标访问一个数组元素,也可以通过指针变量的操作来存取结构数组元素。例如,定义一个结构类型worker和结构数组class:structworker{charname[20];floatsalary;intage;intnum[12];};structworkerclass[10];structworker*pa;pa=&class[0];/*指针变量pa指向结构体数组的首地址*/10.4链表10.4.1链表概述链表是将若干数据项按一定规则连接起来的表,链表中的每个数据称为一个结点。即链表是由称为结点的元素组成的,结点的多少根据需要确定。链表连接的规则是:前一个结点指向下一个结点;只有通过前一结点才能找到下一个结点。因此,每个结点都应包括两方面的内容:(1)数据部分,该部分可以根据需要由多少个成员组成,它存放的是需要处理的数据。(2)指针部分,该部分存放的是一个结点的地址,链表中的每个结点通过指针连接在一起。我们可以对链表进行归类:当然一个链表必须要知道其表头的头指针。如果一个链表中的结点只有一个指向其他结点的指针,则称为单链表;若结点有两个指向其他结点的指针,则称为双链表。10.4.2链表的基本操作对链表的基本操作有建立、查找、删除和修改等。(1)建立链表是指从无到有建立一个链表,即往空链表中依次插入一个结点,并保持结点之间的前驱和后继的关系。(2)查找操作是指在给定的链表中,查找具有检索条件的结点。(3)插入操作是指在某两个结点之间插入一个新的结点。(4)删除操作是指在给定的链表中,删除某个特定的结点,也就是插入的逆过程。(5)修改操作是指在给定的链表中,首先根据某已知的条件,查找到该结点,
本文标题:构造数据类型
链接地址:https://www.777doc.com/doc-3130696 .html