2015内蒙古职业学校C语言程序设计课件:第8章 结构体、共用体和枚举类型02_第1页
2015内蒙古职业学校C语言程序设计课件:第8章 结构体、共用体和枚举类型02_第2页
2015内蒙古职业学校C语言程序设计课件:第8章 结构体、共用体和枚举类型02_第3页
2015内蒙古职业学校C语言程序设计课件:第8章 结构体、共用体和枚举类型02_第4页
2015内蒙古职业学校C语言程序设计课件:第8章 结构体、共用体和枚举类型02_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、8.3 结构型数组的定义和引用,在实际应用中,我们经常要处理的是具有 相同数据结构的一个群体。比如一批书,所有 员工的通信地址,一个班级的学生等。由相同 结构类型变量组成的数组,称为结构型数组。例 如,全班有40人,在总成绩单上每人占一行,每 行的内容包括学号、姓名、3门功课的成绩、平 均分、名次,这样一个总成绩单就可以用结构型 数组表示。,8.3.1 结构型数组的定义和初始化,1.先定义结构型,然后再定义结构型数组并赋初值 2.定义结构型的同时定义数组并赋初值 3.定义无名称的结构型的同时定义数组并赋初值,1.先定义结构型,再定义结构型数组并赋初值运算,struct student /*定义

2、结构型*/ long number; char name10; char sex; float score3; ; struct student s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;,2. 定义结构型的同时定义数组并赋初值,struct student /*定义结构型*/ long number; char name10; char sex; float score3; s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”

3、,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;,3. 定义无名称的结构型的同时定义数组并赋初值,struct /*定义结构型*/ long number; char name10; char sex; float score3; s3= 200001L,”Tom”,m,78,86,92 , 200002L,”Lucy”,f,85,69,82 , 200003L,”Jack”,m,84,88,96 ;,8.3.2 结构型数组元素成员的引用,1.结构型数组元素的引用格式如下; 结构型数组名下标 . 成员名 2.结构型数组元素成员地址的引用格式如下: char n

4、ame10; float scoreN+1; /*score数组前三个元素用来存放成绩,第四个元素用来存 放总分*/ stuN; main() float max=0; int i,j,max_i=0; for(i=0;iN;i+) printf(“输入第%d个学生的信息,依次输入学号,姓名,三个成绩,各数据之间用,隔开”,i); scanf(“%ld,%s,%f,%f,%f”, , ,2. 结构型数组元素成员地址的引用 char name10; ; main() struct student3 s2; long *p_number; char *p_name; p_number= ,8.4

5、指向结构型数据的指针变量的定义和引用,前面已经提到,结构型变量或数组元素 的成员可以使用“成员运算符”来直接引用, 也可以使用指向结构型数据成员的指针变量 来引用,但不方便。我们还可以使用指向结 构型变量或数组元素的指针变量来间接引用 其成员。,8.4.1 指向结构型变量的指针(两种引用方式),方式1 (*指针变量).成员名 方式2 指针变量-成员名 方式1比较好理解,其中“*指针变量”就代表了它所指向的结构型变量,利用“成员运算符”来引用,其作用相当于“结构型变量.成员名”。需要注意的是“*指针变量”必须用圆括号括住,因为“*”运算符的级别低于“.”运算符,如果不加括号,则优先处理“.”运算

6、符,将出现“指针变量.成员名”,会造成语法错误。 方式2是一种新的引用方法,其中“-”称为“指向成员运算符”,也简称“指向运算符”。其运算级别和“()”、“”、“.”是同级的。指向运算符的左边必须是已指向某个结构型变量或数组元素的指针变量,其右边必须是对应结构型数据的成员名。,8.4.2 指向结构型数组的指针,1.指针变量指向数组元素 如果一个结构型数组元素的地址已赋予相同结构型指针变量(即指针变量指向结构型数组元素),可以使用下列两种方法来引用数组该元素的成员,其作用完全相同。 方式1 (*指针变量)。成员名 方式2 指针变量-成员名 注意:这里的指针变量必须是指向某个数组元素的。例如,它指

7、向的数组元素为“数组名k”,则上述两种引用方式均代表“数组名k。成员名”。 2.指针变量指向数组首地址 当一个结构型数组的首地址已经赋予相同结构型的指针变量(即指针变量指向结构型数组),可以使用下列两种方式来引用下标为i的数组元素成员,其作用完全相同。 方式1(*(指针变量+i).成员名 方式2(指针变量+i) 成员名 注意:这里的指针变量必须是指向某个数组首地址的,则上述两种引用方式均代表“数组名i。成员名,8.4.3 在函数间传递结构型数据,1. 采用“全局外部变量方式传递数据” 2. 采用“返回值方式传递数据” 3. 采用“形式参数和实际参数结合的地址传递方式双向传递数据”,8.5 用指

8、针处理链表,我们知道用数组存放数据时,必须事先定义好数 组的大小,不能在程序中随便进行调整。比如有的 班有100人,有的班只有30人,如果要用同一个数 组先后存放不同班级的学生数据,则必须定义长度 为100的数组。如果事先难以确定一个班的最多人 数,则必须把数组定义的足够大,以存放任何班级 的学生数据,这显然非常浪费存储空间。为此C语 言提供了动态数组的构建,即链表。,8.5.1 什么是链表,链表如同一条铁链一样,一环扣一环,中间是不能断开 的。这好比幼儿园的老师带领孩子出去玩,老师牵着第一个 孩子的手,第一个孩子的另一只手牵着第二个孩子的手 这就是一个“链”,最后一个孩子有一只手空着,他就是

9、“链 尾”。要找这个队伍,就必须先找到老师,然后顺序找到每 一个孩子。 链表是一种动态数据结构,在程序的执行过程中可以根据 需要随时间系统申请存储空间,动态地进行存储空间的分 配。动态数据结构最显著的特点是包含的数据对象个数及其 相互关系都可以按需要改变。常用的动态数据结构有链表、 循环链表、双向链表三种。本章只介绍动态数据结构中最简 单的单链表的建立及其基本操作。,1.单链表的结构,链表有一个“头指针”head,它存放链表第一个结点的首地址,它没有数据,只是一个指针变量。从图8-2中我们看到它指向链表的第一个元素。链表的每一个元素称为一个“结点”(node)。每个结点都分为两个域,一个是数据

10、域,存放各种实际的数据,如学号num、姓名name、性别sex、和成绩score等。另一个域为指针域,存放下一个结点的首地址,即指向下一个结点。链表中的每一个结点都是同一个结构类型。最后一个结点称为“链尾”,尾结点无后续点,因此不指向其他的元素,表尾结点的指针为空(NULL)。,2.链表结点的构成,由于每个结点包含数据域或者指针域两部分内容,所以链表结点采用 结构体表示。例如链表结点的数据结构定义如下: struct node int num; char name10; float score; struct node *next; ; 在链表结构中,除了数据项成员之外,还应包含一个指向本身的

11、指 针,该指针在使用时指向具有相同类型结构体的下一个结点。 在链表结点的数据结构中,比较特殊的一点就是结构体内指针域的数 据类型使用了未定义成功的数据类型。这是在C语言中唯一可以先使 用后定义的数据结构。,3.如何建立和输出一个简单静态链表,【例 8.10】建立一个如图8-3所示的简单链表,它由三个学生数据结点组成。请输出各结点中的数据。 分析:为方便操作,将学生定义为一个结构体类型student,它有三个成员分别用来表示学生的学号、姓名和下一个结点的地址。在程序中逐个输入各学生的数据,通过地址赋值操作建立链表。利用当型循环用printf语句逐个输出个结点中成员的值。,程序如下: #inclu

12、de struct student char no6; char name10; struct student *next; ; void main() struct student A=“02001”,”tom”, B=“02002”,”jane”, C=“02003”,”henry”; struct srudent *head=NULL,*p; head= 在本例中,所有结点都是在程序中定义的、不是临时开辟的、用完后也不能释放,我们把这种链表称为“静态链表”,4动态存储分配函数,所谓“动态链表”就是链表的结构是动态分配和存储的,在程序的执行过程中要根据需要随时向系统申请存储空间,动态地进行

13、存储空间的分配。在C语言中,提供了一下函数完成存储空间的动态分配和释放。 malloc函数 calloc函数 free函数,malloc函数,其函数原型为:void * malloc(unsigned size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间,并返回指向该空间起始地址的指针。若分配失败(如系统不能提供所需内存),则返回空指针NULL。,calloc函数,其函数原型为:void * calloc(unsigned n,unsigned size) 该函数有两个形参n和size。其作用是在内存的动态存储区中分配n个长度为size的连续空间,并返回指向该空间首地址的指

14、针。如用calloc(20,20)可以开辟20个(每个大小为20字节)的空间,即空间总长为400字节。若分配失败,则返回空指针NULL。,free函数,其函数原型为:void * free(void * ptr) 其作用是释放由malloc、calloc等函数申请的内存空间,使这部分内存区能够被其他变量所使用。ptr是最近一次调用malloc()或calloc()函数返回的值。Free函数没有返回值。 在使用上述函数时要注意,函数的原型在文件malloc.h和stdlib.h中定义。在程序中必须包含这两个头文件。下面的程序就是malloc()和free()两个函数配合使用的简单实例。,【例 8.11】存储空间的动态分配。,#include #include #include main() char *str; if(str=(char*) malloc(10)=NULL) printf(“Not eno

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论