收藏 分享(赏)

第5章+结构、共用体和链表.ppt

上传人:mcady 文档编号:4857481 上传时间:2019-01-16 格式:PPT 页数:27 大小:184.50KB
下载 相关 举报
第5章+结构、共用体和链表.ppt_第1页
第1页 / 共27页
第5章+结构、共用体和链表.ppt_第2页
第2页 / 共27页
第5章+结构、共用体和链表.ppt_第3页
第3页 / 共27页
第5章+结构、共用体和链表.ppt_第4页
第4页 / 共27页
第5章+结构、共用体和链表.ppt_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、第5章 结构、共用体和链表,在实际应用中,常常需要把类型不同的一系列数据存储在一起,例如要登记一个学生的信息,则需要记录他的姓名(C-string)、学号(整型或字符型)、年龄(整型)和身高体重(浮点型)等,前面介绍的数组无法完成这一任务,因为数组要求所有的元素属于同一类型。结构(struct)可以满足我们的要求,为了满足程序设计的需要,C+允许我们自己定义数据类型,称之为自定义数据类型,结构是自定义数据类型中的一种,它可将多种数据类型组合在一起使用。 共用体可以看成一种特殊的结构,与结构不同的地方在于它允许在系统内存的同一块区域保存不同类型的数据。将一个个的结构变量或共用体变量用指针联系起来

2、,便形成了链表。正确使用结构、共用体和链表,才能写出高质量的C+程序。,5.1 结构,结构是比数组更为灵活的一种数据结构,从字面上看,结构看作一组变量,它们可以具有不同的数据类型,集合到一个整体中,这个整体就是结构,仍举存储学生信息这个例子,可以定义一个student结构,编译器将该结构看成一个整体,或者说一个类型,和int、double等一样,程序中可以声明student型的变量,该变量包含了一个学生的姓名、学号、年龄、身高和体重等一系列信息。使用结构,可以有效地实现相关信息的存储和管理。,5.1.1 如何定义一个结构,结构是用户定义的一种数据类型,定义了结构后,便可以通过声明创建这种类型的

3、变量,因此,结构的使用有两个步骤:一是结构的定义,二是结构变量的声明。 我们可以采用如下形式定义一个student型的结构: struct student char name20; int age; float weight; ;,5.1.2 结构变量的声明和使用,在程序中,可以像声明普通的int型变量一样声明一个结构变量,如: struct student A; 该语句声明了一个student型的变量A,在声明结构变量时,关键词struct可以省略,而直接写成“student A;”,这样,结构类型student的用法就和int、long等基本类型名相同,这说明,结构定义了一种新类型。 结构

4、类型和结构变量是两个不同的概念,结构类型就象int、double等类型一样,是一种数据类型,编译器并不对它分配内存空间,只有声明了结构类型的变量时,才对该变量分配存储空间。,5.1.3 结构变量的初始化,在声明结构变量的同时,可以进行变量的初始化: student stu1=“Ronaldo”,30,70.5;或student stu1=R,o,n,a,l,d,o,0,30,70.5; 和数组一样,将用逗号分割的值列表用花括号括起来,以完成stu1的初始化。 事实上,可以将结构定义,变量声明和变量初始化放在一起来完成,见代码52。,5.1.4 结构变量间是否可以相互赋值,数组可以看成是一组相同

5、类型数据的结合,而结构可以看作是一组不同类型数据构成的整体,在第3章中介绍到,除了可以对字符数组进行整体的输入输出外,C+一般不允许对数组进行整体的操作,必须通过元素遍历的方式实现对数组的整体操作,那么,结构变量间是否允许相互赋值呢,答案是肯定的。 可以使用赋值操作符(=)将一个结构变量B赋值给另一个结构变量A,这样,结构变量A中的每个成员都将被设置成结构变量B中相应成员的值,即使成员是数组类型也不例外,这种赋值方式被成为成员赋值,见代码53。,5.1.5 结构体变量的sizeof,一般来说,结构体变量占据的内存大小是所有成员变量占据内存大小之和,但有些例外需要特别注意,先看一个结构体: st

6、ruct ExS1 char c1; short s1; int i1; ; 从字面上来看,sizeof(ExS1)的结果似乎应该是1247,但实际上,返回结果为8,这牵扯到字节对齐机制。,5.2 共用体,共用体(union)也称联合,可以看成一种特殊的结构。和结构一样,共用体可以包括多种数据类型,但在共用体中,各种数据类型在内存中占据同一地址,换句话说,在某个确定的时刻,共用体只能表示一种数据类型。和结构的使用方法一致,共用体的使用也分为共用体的定义、共用体变量的声明两个步骤。,5.2.1 共用体的定义,共用体可采用如下形式定义: union 共用体名称(或称标识) 存储数据列表(或称成员变

7、量列表) ; 注意,结束花括号后的分号(;)不要遗漏,这种定义形式是一个完整的C+语句。 举例来说,下列代码定义了computer共用体,根据此定义,便可以像创建结构变量那样创建computer类型的共用体变量。 union computer char brand10; float price; ;,5.2.2 共用体和结构的不同,5.2.3 共用体变量的声明和初始化,在定义了一个共用体后,同样可以像声明一个int型变量一样声明一个共用体变量,形式如下: union 共用体名 共用体变量; 其中,关键词union可以省略,如中的“comUnion com1;”,这说明,共用体定义了一个新类型。

8、 在声明一个共用体的同时,可以完成其初始化,与结构变量的初始化不同的是,只能对共用体变量列表中的一个变量进行初始化,确切地说,是对列表中的第一个变量进行初始化,对中的comUnion共用体而言,下列语句是合法的: comUnion com1=“Acer“; 但如果用“comUnion com1=7000;”对com1进行初始化,编译器则会给出警告,比较两种写法可以发现,初始化语句针对的是共用体列表中第一个变量(字符数组brand)。,5.2.4 共用体使用举例,为了方便管理,某学校决定为学生和老师制作统一的卡片,其中有一项内容是所在单位,对学生来说,代表其所在年级(int型),但对老师来说,代

9、表学校某个部门(字符数组),这样的数据应如何组织呢,使用数组不行,因为数组中必须存储同类型的数据,使用结构也不行,因为年级和部门只能取其一,两者之间不是并列的关系,对这个问题来说,最好的方法是使用共用体,来看一段示例代码。,5.2.5 共用体的sizeof,原则上讲,共用体的变量的大小取决于所有的成员中占用空间最大的一个,举例来说: union Ex double x; char y; ; 则sizeof(Ex)等于8,但和结构体变量内存分配的准则三仍旧成立,如: union Ex1 char x13; float y; ;,5.3 结构数组和共用体数组,在程序中定义的结构和共用体相当于一个新

10、的类型,可以像创建int型或double型变量一样创建结构变量,很多个int型变量可以构成整型数组,结构变量和共用体变量同样可以构成数组,称为结构数组或共用体数组。实际应用中,经常用结构数组来表示具有相同数据结构的一个群体,如一个班的学生档案,与以前学习的数组不同,结构数组的每一个元素都是一个结构类型的数据。 比如,要建立10个学生的数据,每个学生的信息由一个结构变量表示,那么,这10个结构变量就可以构成一个大小为10的结构数组,其中每一个数组元素包含该结构存储变量列表中的所有数据,这样可以很方便对这10个学生的相关数据进行管理。,5.3.1 结构数组的声明和初始化,结构数组的声明方式与一般的

11、数组类似,形式如下: 结构类型名 结构数组名元素个数; 以中的student结构为例,下列语句就声明了一个大小为10的结构数组stuInfo,数组中的每个元素都是student型的结构变量。 student stuInfo10; 结构数组的初始化也与其它数组的初始化方法类似,既可以在声明数组的同时对元素初始化,也可以在数组建立完毕后,对元素进行赋值。 仍以中的student结构为例,说明结构数组初始化的方法。,5.3.2 共用体数组的声明和初始化,共用体数组的用法与结构数组用法几乎完全一致,唯一的不同之处在于对数组元素的初始化时,只能对共用体存储变量列表中的一个成员赋值。 共用体数组声明形式为

12、: 共用体类型名 共用体数组名元素个数; 以中的共用体comUnion为例,下列语句就声明了一个大小为5的共用体数组sz,数组中的每个元素都是comUnion型的结构变量。 comUnion sz5; 与结构数组类似,共用体数组既可以在声明数组的同时对元素初始化,也可以在数组建立完毕后,对元素进行赋值。,5.4 指向结构的指针,在程序中,常常需要为结构动态分配内存,这需要指向结构类型变量的指针。对指向结构变量的指针来说,其使用方法与指向其他类型(如int、double)等的指针类似。一个指针变量当用来指向一个结构变量时,便称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结

13、构指针便可访问该结构变量。由于共用体可以看成一种特殊的结构,指向共用体的指针与指向结构的指针使用方法一致,因此,本节中将指向共用体的指针与指向结构的指针统称为结构指针。,5.4.1 声明一个结构指针,和普通指针类似,可采用下列形式声明一个结构指针: 结构名 *指针变量名; 以中定义的的student结构为例,“student* p”声明了一个指向结构student的指针p,给指针变量p赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。 和普通指针的使用方法一致,可以将“结构名*”看成一种符合类型。 student stu1; student* p=,5.4.2 结构指针的初始

14、化,确切知道一个指针的指向是十分必要的,因此,在声明结构指针后,必须有意识地对其进行初始化,除了前面介绍的用取结构变量地址的方法对结构指针初始化外,介绍两种其他方式的初始化。 (1)指针间的相互赋值 指针变量也可以指向一个结构数组,此时结构指针变量的值是整个结构数组的首地址,可以用数组名指针对结构指针赋值,仍以中定义的的student结构为例: student sz10; student* p=sz; (2)动态分配内存 下列语句声明了一个指向student型的结构指针p,并用new命令动态申请了一块大小与student型变量相同的内存,将这块内存的首地址赋值给p。 student* p=ne

15、w student;,5.4.3 使用指针访问结构成员,C+提供了使用一种结构类型指针访问结构成员的方法,就是使用运算符“-“: 指针变量-成员名 这与“(*指针变量). 成员名”是完全等价的,见代码5-7。,5.5 链表,第3章中已经介绍了数组的概念,数组对应着一个连续存储的内存块,将同类型的 元素一个个地排列起来,实际上,还可以利用指向变量的指针把一系列的变量组织起来,形成一种新的数据结构,称为链表。,5.5.1 链表的结构,链表元素常称为链表结点,每一个结点包含两个域:数据域和指针域。数据域保存数据,指针域连接该结点到下一个结点,可以看出,结点数据是一种复合类型(结构,以及在第三篇中要介

16、绍的类的对象),每一个结点占用一块存储单元,当要在链表中增加一个结点时,可动态地为该结点分配一个存储单元;当要在链表中删除一个结点时,也可释放该结点的存储单元。 图5.2为3个结点(A、B和C)互相链接形成链表的示意图,其特点是每个结点最多只有一个先驱结点和一个后继结点,首结点A只有一个后继结点,没有前驱结点,而最终结点C只有一个前驱结点没有后继结点,中间的结点B既有一个前驱结点也有一个后继结点。每个结点都由两部分组成,一是用来存放各种实际数据的数据域,另一个是指针域,存放下一结点的首地址,例如,A的地址域中存放的是B的地址&B,,5.5.2 创建链表,下面通过示例代码58来看一下链表,尤其是

17、同质链表的创建和使用,异质链表的创建和使用与此相同。,5.5.3 链表与数组的区别,链表和数组各有特点,表5.1从“内存占用”、“元素类型”、“组织形式”和“插入删除元素”等方面直观体现了两者的区别。,5.5.4 链表的遍历和查找,链表的结构相对而言比较特殊,在对链表中的结点进行访问和查找的时候,必须从链表的头结点开始,按照链表结点指针域所指的顺序逐个查找结点,直到找到为止。和对数组元素的访问一样,利用循环结构对链表结点 进行遍历是一种常用的方法,中使用的就是while循环结构,循环的终止条件便是判断next指针是否为NULL(即是否已经到达了最终结点)。 举例而言,对创建的链表,想要知道na

18、me成员为“Deco”的结点中age成员的值,可以完成该功能。,5.5.5 链表的插入和删除,和数组相比,链表可以很方便地进行数据元素的插入和删除,在一个链表中插入一个结点或删除一个结点,只需要知道待插入或删除结点位置及指向前一个结点的指针。是链表结点插入删除操作的形象示意图。 从可以看出,向一个链表中插入一个结点,只需要两步操作: 将插入位置前一结点(B)的指针域赋值给待插入结点(E)的指针域,使其指向插入位置后一结点(C)。 将待插入结点(E)的地址赋值给前一结点(B)的指针域。 从一个链表中删除一个结点,只需将待删除结点(C)的指针域赋值给删除位置前一结点(B)的指针域即可。,5.6 小结,结构是自定义数据类型中的一种,它可将多种数据类型组合在一起使用,方便了程序对一些复杂数据的处理。共用体是一种特殊的结构,在某个确定的时刻,共用体只能表示一种数据类型,各种数据类型在内存中占据同一地址。 结构和共用体的使用都可分为定义和变量声明两个步骤,在声明结构变量或共用体变量以前,必须先进行结构类型或共用体类型的定义。访问数据成员,可以用的成员运算符有两个:“.“和“-“。“(*指针变量).成员名”、“变量.成员名”和“指针变量-成员名”3种方式是等价的。最后介绍了链表,链表综合了结构和指针的有关内容,和数组相比,链表有诸多优点,使用好链表,可以更好地将程序需要的数据组织起来。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报