C语言入门经典(第四版)11-结构化数据

上传人:飞*** 文档编号:33914715 上传时间:2018-02-19 格式:PPT 页数:34 大小:445.50KB
返回 下载 相关 举报
C语言入门经典(第四版)11-结构化数据_第1页
第1页 / 共34页
C语言入门经典(第四版)11-结构化数据_第2页
第2页 / 共34页
C语言入门经典(第四版)11-结构化数据_第3页
第3页 / 共34页
C语言入门经典(第四版)11-结构化数据_第4页
第4页 / 共34页
C语言入门经典(第四版)11-结构化数据_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《C语言入门经典(第四版)11-结构化数据》由会员分享,可在线阅读,更多相关《C语言入门经典(第四版)11-结构化数据(34页珍藏版)》请在金锄头文库上搜索。

1、第11章 结构化数据,前面学习了如何声明和定义变量,使之包含各种类型的数据,如整数、浮点数和字符等。学习了如何创建这些类型的数组及指针数组,这些指针指向包含可用数据类型的内存位置。这些很有用,但是许多应用程序还需要一些更灵活的功能 。,11.1 数据结构:使用struct,关键字struct能定义各种类型的变量集合,称为结构(structure),并把它们视为一个单元 。 定义结构类型和结构变量 访问结构成员 未命名的结构 结构数组 表达式中的结构 结构指针 为结构动态分配内存,11.1.1 定义结构类型和结构变量,可以将结构的声明和结构变量的声明分开。取代前面例子的语句如下:struct h

2、orseint age; int height; char name20; char father20; char mother20; ; struct horse Dobbin = 24, l7, Dobbin, Trigger, Flossie;,11.1.2 访问结构成员,现在知道如何定义结构及声明结构变量了,还必须引用结构的成员。结构变量的名称不是一个指针,所以需要特殊的语法访问这些成员。 要引用结构成员,应在结构变量名称的后面加上一个句点,再加上成员变量名称。例如,发现Dobbin隐瞒了它的年龄,事实上它比初始化的值年轻,就可以将值修正如下: Dobbin.age = 12;,11.

3、1.3 未命名的结构,不定要给结构指定标记符名字。用一条语句声明结构和该结构的实例时,可以省略标记符名字。在上一个例子中,声明了horse类型和该类型的实例My_first_horse,也可以改为:struct /* Structure declaration and. */int age;int height;char name20;char father20;char mother20; My_first_horse; /* .structure variable declaration combined */ 使用这种方法的最大缺点是不能在其他语句中定义这个结构的其他实例。这个结构类型的

4、所有变量必须在一行语句中定义。,11.1.4 结构数组,保存马匹数据的基本方法就是这样,但在处理50或100匹马如此大量的数据时会比较麻烦,此时需要一个更可靠的方法去处理大量的马匹数据。使用变量也会遇到这个问题。此时解决方法是使用数组,这里也可以声明一个horse数组。,11.1.5 表达式中的结构,结构中的成员可以像一般变量那样用于表达式。以程序11.2中的结构为例,可以将它们用在下面的表达式中: My_horses1.height = (My_horses2.height + My_horses3.height/2; 匹马的高度是另两匹马的平均高度是没什么道理的,但这是一个合法的语句。也可

5、以在赋值语句中使用整个结构元素。 My_horses1 = My horses2;,11.1.6 结构指针,要获得结构的地址,就需要使用结构的指针。由于需要的是结构的地址,因此需要声明结构的指针。结构指针的声明方式和声明其他类型的指针变量相同,例如: struct horse *phorse; 这条语句声明了一个phorse指针,它可以存储horse类型的结构地址。现在可以将phorse设置为一个特定结构的地址值,使用的方法和其他类型的指针完全相同,例如: phorse = ,11.1.7 为结构动态分配内存,可以利用前面掌握的各种工具重写程序11.2,以更经济的方式使用内存。程序11.2的最

6、初版本为包含50个horse结构的数组分配了内存,而实际上并不需要这么多内存。 要为结构动态分配内存,可以使用结构指针数组,其声明非常简单,如下所示: struct horse *phorse50; 这行语句声明了50个指向horse结构的指针数组。该语句只给指针分配了内存。还需要分配一些内存来存储每个结构的成员。,11.2 再探结构成员,前面说过,所有基本数据类型(包含数组)都可以成为结构的成员。除此之外,还可以把一个结构作为另一个结构的成员,不仅指针可以是结构的成员,结构指针也可以是结构的成员 。 将一个结构作为另一个结构的成员 声明结构中的结构 将结构指针用作结构成员 双向链表 结构中的

7、位字段,11.2.1 将一个结构作为另一个结构的成员,本章的开头为满足马饲养员的需要,设计了一个程序,处理每匹马的各种数据,包括名字、身高和生日等,但程序11.1用年龄代替了生日。其部分原因是日期处理起来比较麻烦,要用3个数值表示,还要处理闰年的问题。现在准备将一个结构作为另一个结构的成员来处理日期 。,11.2.2 声明结构中的结构,可以在horse结构的定义中声明Date结构,如下:struct horsestruct Dateint day; int month; int year; dob; int height; char name20; char father20; char mo

8、ther20; ;,11.2.3 将结构指针用作结构成员,任何指针都可以是结构的成员,包含结构指针在内。结构成员指针可以指向相同类型的结构。例如,horse类型的结构可以含有一个指向horse类型结构的指针。,11.2.4 双向链表,前一个例子创建的链表有一个缺点:只能往前走。其实,只需小小的修改,就可以得到双向链表(doubly linked list),可以双向遍历链表。方法是除了指向下一个结构的指针外,在每个结构中再添加一个指针,存储前一个结构的地址 。,11.2.5 结构中的位字段,位字段(bit-fields)提供的机制允许定义变量来表示一个整数中的一个或多个位,这样,就不需要为每个

9、位明确指定成员名称了。,11.3 结构与函数,结构表示C语言的一个强大特性,因此它与函数并用非常重要。现在探讨如何把结构当成变元传递给函数,以及如何从函数中返回结构 。 结构作为函数的变元 结构指针作为函数变元 作为函数返回值的结构 修改程序 二叉树,11.3.1 结构作为函数的变元,将结构作为变元传给函数和传递一般变量没有什么不同。创建类似于horse的结构,如下:struct familychar name20; int age; char father20; char mother20; ;,11.3.2 结构指针作为函数变元,在调用函数时,传送给函数的是变元值的副本。如果变元是一个非常

10、大的结构,就需要相当多的时间,并占用结构副本所需的内存。在这种情况下,应该使用结构指针作为变元。这可以避免占用内存,节省复制的时间,因为只需复制指针。函数可以通过指针直接访问原来的结构。另外,使用指针给函数传送结构,也提高了效率。重写siblings()函数,如下:bool siblings(struct family *member1, struct family *member2)if(strcmp(member1-mother, member2-mother) = 0)return true; elsereturn false; ,11.3.3 作为函数返回值的结构,函数返回结构和返回一

11、般数值一样,只是在函数原型中,要以正常的方式指出函数返回的是结构,例如:struct horse my_fun(void); 这个函数原型说明,它是一个没有变元的函数,返回horse类型的结构。可以像这样从函数返回一个结构,但比较方便的做法是返回结构指针,11.3.4 修改程序,下面创建一个例子,将结构指针作为变元和返回值。修改前一个例子(程序11.6),在Family类型的结构中声明一些额外的指针p_to_pa和p_to_ma,如下所示:struct Family /* Family structure declaration */struct Date dob;char name20;ch

12、ar father20;char mother20;struct Family *next; /* Pointer to next structure */struct Family *previous; /* Pointer to previous structure */struct Family *p_to_pa; /* Pointer to father structure */struct Family *p_to_ma; /* Pointer to mother structure */;,11.3.5 二叉树,二叉树是组织数据的一种非常有效的方式,因为二叉树中的数据可以以有序的方

13、式安排。二叉树也是一种非常有趣的机制,它在本质上非常简单。实现二叉树涉及到递归和动态分配内存,还要使用指针传送结构。 二叉树包含一系列相互关联的元素,称为节点。起始节点是树的根,称为根节点。,11.4 共享内存,前面讨论了如何使用位字段节省内存,这一般应用于逻辑变量。C语言还有另一个功能,可以将几个变量放在相同的内存区。这个功能在内存短缺时比位字段应用得更广,因为实际上,我们常常使用几个变量,但其中只有一个变量在任意给定的时刻都有有效值。 联合 联合指针 联合的初始化 联合中的结构成员,11.4.1 联合,在C语言中允许在多个不同变量共享同一内存区的功能称为联合(union)。声明联合的语法类

14、似于结构,给联合指定标记名称的方式通常也是类似的。定义联合要使用关键字union。例如下面的语句声明一个联合被三个变量共享。union u_examplefloat decval; int *pnum; double my_value; U1;,11.4.2 联合指针,也可以用下列语句定义联合指针:union u_example *pU; 有了指针后,就可以修改联合的成员了。如下列语句:pU = 第二行赋值语句中,等号右边的表达式pUdecval等于U2.decval。,11.4.3 联合的初始化,声明联合时,若需要初始化联合的实例,只能用和联合中第一个变量相同类型的常量初始化。以u_example为例,只能用float常量去初始化,如下所示: union u_example U4 = 3.14f; 可以重新安排联合中成员的顺序,将要初始化的成员作为第一个成员。联合中成员的顺序并不重要,因为它们都重叠在同一个内存区中。,11.4.4 联合中的结构成员,结构和数组可以是联合的成员。反之,联合也可以是结构的成员。例如:struct my_structureint numl; float num2; unionint *pnum; float *pfnum; my_U; samples5;,11.5 定义自己的数据类型,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号