C语言第七次作业答案ppt课件.ppt
《C语言第七次作业答案ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言第七次作业答案ppt课件.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章 结构体、联合和枚举8.1 结构体概述结构体概述8.2 结构体类型定义结构体类型定义8.3 结构体变量结构体变量8.4 结构体数组结构体数组8.5 指向结构体类型数据的指针指向结构体类型数据的指针8.6 结构体和函数结构体和函数8.7 单链表单链表8.8 联合与枚举联合与枚举8.9 用用typedef定义类型定义类型概述 在一些复杂的数据结构中,有时需要将不同类型的在一些复杂的数据结构中,有时需要将不同类型的数据集合成一个有机的整体。数据集合成一个有机的整体。 如:一个学生的情况纪录单可能包括学号、姓名、如:一个学生的情况纪录单可能包括学号、姓名、性别、年龄、成绩、家庭地址等数据项。这样
2、的整性别、年龄、成绩、家庭地址等数据项。这样的整体,体,C语言中称为语言中称为“结构体结构体”数据结构,简称数据结构,简称“结结构体构体” (structure)。)。 结构体是一种较为复杂而又非常灵活的构造型的数结构体是一种较为复杂而又非常灵活的构造型的数据类型。一个结构体类型的数据可以由若干个称为据类型。一个结构体类型的数据可以由若干个称为成员成员(或域)的成分组成。不同的结构体类型其成(或域)的成分组成。不同的结构体类型其成员也不同。对于一个具体的结构体而言,其成员的员也不同。对于一个具体的结构体而言,其成员的数量是固定的,这一点与数组相同,但该结构体中数量是固定的,这一点与数组相同,但
3、该结构体中各成员的数据类型可以不同,这是结构体与数组的各成员的数据类型可以不同,这是结构体与数组的重要区别。重要区别。 8.1 结构体类型的定义结构体类型定义的一般形式:结构体类型定义的一般形式: struct 结构体名结构体名 结构体成员表列结构体成员表列 ; 其中其中struct是关键字,是关键字,结构体成员表列结构体成员表列也称也称域表域表,每个成员也称结构体中的一个域。对每个成员都应每个成员也称结构体中的一个域。对每个成员都应进行类型说明。进行类型说明。 例如:例如:struct student int num; char name20; char sex; int age; floa
4、t score; ;对结构体类型定义的总结1 结构体类型定义是由程序员根据设计需要自行定义结构体类型定义是由程序员根据设计需要自行定义的,因此结构体类型可以有多种,每种结构体类型都的,因此结构体类型可以有多种,每种结构体类型都可以有自己的结构体名以及包含不同数目的成员。可以有自己的结构体名以及包含不同数目的成员。2 若定义了一个结构体类型,那仅仅是定义类型而已,若定义了一个结构体类型,那仅仅是定义类型而已,而不分配内存单元。例如上面已经定义了的而不分配内存单元。例如上面已经定义了的struct student结构体类型,结构体类型,struct student可以用来定义可以用来定义一个该类型
5、的变量,并不意味着它的那些成员被分配一个该类型的变量,并不意味着它的那些成员被分配了内存空间。了内存空间。3 成员名可以与程序中的变量名相同,两者不代表同成员名可以与程序中的变量名相同,两者不代表同一对象。例如,程序中可以另定义变量一对象。例如,程序中可以另定义变量num,它与,它与struct student中的中的num是两回事,互不干扰。是两回事,互不干扰。4 结构体成员类型可以是整型、实型、字符型、数组、指针等基本类型或构造类型,还可以是已定义过的结构体类型。struct date int year; int month; int day; struct student int num
6、; char name20; char sex; struct date birthday; float score4;8.2 结构体变量 结构体类型的定义只是指出了该结构的组成情况,表明存在有此种类型的结构模型。该结构体类型中不能存放具体的数据,系统也不会为它分配实际的存贮单元。为了能在程为了能在程序中使用结构体类型的数据,应在定义了某序中使用结构体类型的数据,应在定义了某种结构体类型以后,再定义该结构体类型的种结构体类型以后,再定义该结构体类型的变量,以便在结构体类型的变量中存放具体变量,以便在结构体类型的变量中存放具体的数据。的数据。 结构体变量的定义有三种形式:结构体变量定义1 1先声
7、明结构体类型,再定义结构体类型的变量。 struct student int num; char name20; char sex; int age; float score4; ; struct student st1, st2;结构体变量定义2 2在声明结构体类型的同时定义结构体类型的变量。struct student int num; char name20; char sex; int age; float score4;st1,st2;结构体变量定义3 3直接定义结构体类型变量。struct int num; char name20; char sex; int age; float
8、 score4;st1,st2; 在关键字struct后省略了结构体名 。不提倡使用这种形式。可用sizeof来计算一个结构体类型数据的长度 如:sizeof(struct student) 或 sizeof(st1)结构体变量初始化 初始化就是在定义变量的同时给变量赋初值,例如:struct student int num; char name8, sex; struct date int year, month, day; birthday; float score4;st1=101, “Xu, F, 1975, 9, 12, 83.5, 88, 75.5, 90;在对结构体变量进行初始化
9、时,系统是按每个成员在结构体中的顺序一一对应赋初值的。若只对部分成员进行初始化,则只能给前面的若干成员赋值,而不允许跳过前面的成员给后面的成员赋值。未赋值部分均为0值。 结构体变量的引用 1.结构体变量整体引用如果要将结构体变量整体引用则往往只限于将一个结构体变量直接赋值给另一个具有相同类型的结构体变量。例如有声明语句:struct student stux,stuy;,执行stuy=stux;语句后变量stuy中各成员的值都完全与stux各成员的值相等。 2. 结构体变量成员引用 对结构体成员的引用方式为: 结构体变量名结构体变量名.成员名成员名其中,“.”为结构体成员运算符,它的优先级处于
10、所有运算符优先级的最高级别 。例如:st1.num表示st1变量中的num成员,可以对它赋值st1.num=1001,这时st1.num就相当于一个整型数。 结构体变量引用规则说明1 结构体变量整体不能直接用来输入输出。如: scanf (%d,%s,%c,%d,%f,&st1); 但可逐个全部或部分输入输出。如: scanf(“%d%c%f”, &st1.num, &st1.sex, &st1.score2);2 若成员本身又是一个结构体类型,则必须逐层使用成员名定位,找到最底层的成员。例如在结构体变量st1中对成员year的引用方式为:st1.birthday.year。3 若结构体中的成
11、员是字符型数组时,则可将其看作是“字符串变量”,而直接引用。例如:对st1中name的引用可写成:st1.name。4 若结构体中的成员是数值型数组时,则对该数组成员的引用,应该为对该数组元素的引用。例如:对st1中score数组元素的引用可写成:st1.score0,st1.score1,st1.score2,st1.score3。Wrong! 我们可以将结构体中变量的每个成员当作是同类型的普通变量,对它进行同类变量所允许的任何操作。例如成员变量st1.name是字符串,可以对它进行字符串变量所允许的任何操作,包括输入、输出。同样对于成员中的数组元素也可按同类型的数组元素进行操作。如: sc
12、anf(%s, st1.name); /* 对结构体成员name赋值 */ for(i=0; i4; i+) scanf(%f, &st1.scorei); /* 对结构体数组成员score赋值 */ st1.num+; /* 结构体成员num自增运算 */ st1.sex=getchar(); /* 对结构体成员sex进行赋值 */ st1.brithday.year = 1999;float f;for(i=0; i4; i+) /*在TC中的赋值语句*/ scanf(%f, &f); st1.scorei =f; 例8.1 写程序给结构体变量赋初值。struct student int
13、num; char name20,sex; int age; float score;main() struct student st; printf(please input data:n); scanf(%d %s %c %d %f, &st.num,st.name, &st.sex, &st.age, &st.score); printf(%d %s %c %d %.1f, st.num, st.name, st.sex, st.age, st.score);8.4 结构体数组结构体数组是同类型结构体变量的集合。 1. 结构体数组的定义和初始化结构体数组的定义和初始化struct stu
14、dent int num; char name20; char sex; int age; float score; sta 31001,LiLi,m,20,75.0, 1002,“fangfang,m,21,86.0, 1003,“yuanyuan,f,19,91.0;2.结构体数组的输入和输出 对结构体数组数据的输入或输出可利用for循环结构,例如:int i;for(i=0;i2;i+)scanf (%d %s %c %d %f, &stai.num, stai.name, &stai.sex, &stai.age, &stai.score);这是给数组sta3的元素赋值操作 。例1:求
15、30个学生的平均成绩。 main ( ) struct student int num; char name20; char sex; int age; float score; st30; int i; float average=0.; for (i=0; i30; i+) scanf(“%d %s %c %d%f, &sti.num, sti.name, &sti.sex, &sti.age,&sti.score); average +=sti.score; average /=30.; printf(nNo name sex score addr ); for(i=0; inum来代替
16、,来代替,“-”称为指向运算符称为指向运算符 。因此,下面引用结构体成员的几种方式完全等价: 结构体变量名结构体变量名.成员名成员名(如如stu.num) 结构体指针名结构体指针名-成员名成员名(p-num) (*结构体指针名).成员名 (&结构体变量名)-成员名更地道!“.”只可用在表示变量名含义的变量的后面,而只可用在表示变量名含义的变量的后面,而“-”只可用在表示地址含义的变量的后面。只可用在表示地址含义的变量的后面。 3 指向结构体数组的指针 例8.3定义一个结构体数组并赋初值,用指针法输出这些数据。struct student int num; char name10; char s
17、ex;main() struct student st3=101,Xu,M,102,Yan,F,103,Ling,F; struct student *p; printf(No Name Sex:n ); for(p=st;pnum,p-name,p-sex);8.6 结构体与函数1. 向函数传递结构信息 一、结构体变量成员作函数参数一、结构体变量成员作函数参数 (见【例8.4】) 只要结构体成员是具有单个值的数据类型(即int等相关类型),就可以把它作为参数传递给一个接受这个特定类型参数的函数。 二、结构体变量作函数参数二、结构体变量作函数参数(见【例8.5】) 三、结构体指针作函数参数三、
18、结构体指针作函数参数(见【例8.6】) 把一个完整的结构体变量作为参数传递,在新的C标准中虽然合法,但要将成员值一一传递,费时间又费空间。如果结构体类型中的成员很多,或有一些成员是数组型,则程序运行效率会降低。在这种情况下,用结构体指针作函数参数能提高些运行效率。2. 结构体指针作为函数返回值 (见【例8.7】)8.7 单链表链表概述、结点建立链表、输出链表插入结点、删除结点其他链表结构1 概述 C语言程序为批量的数据集合向操作系统申请存储空间时一般有三种模式: 一、用数组。用数组存放数据时,通过数据类型定义,数组在程序编译期间就申请到了所要求的存储空间,因此必须事先定义好固定的长度,并且连续
19、存放,对于那些数组元素不确定的数组,在定义时就得用可能的最多元素的个数来定义,实际应用中可能会造成大的浪费。(静态静态存储分配方式) 二、利用C语言提供的动态内存分配函数,在需要使用到某一批数据前分配相应数量的存储空间块,该存储块由一个指针来标识。这个操作过程是在程序运行中完成的,这是一种半动态半动态的存储分配方式。 三、用链表C语言中引入的一种重要的数据结构。 链表是完全动态完全动态地进行存储分配的一种结构。它能随时随地根据需要开辟内存单元。链表中的各元素在内存中可以不连续存放,通过指针把它们串连成一个整体,并且被串连的数据个数和顺序关系可以按需改变,因此能方便迅速的插入、删除数据项。 单链
20、表结构 链表有单链表、双链表和循环链表之分,本章重点介绍其中的一种最简单也是最常用的链表:单链表 有关单链表的基本概念链表是一种链式结构,各元素在内存中可以不是连续存放的。 链表中的元素又称为结点,结点必定是结构体变量,它包含两个方面的数据:一为用户要用到的实际数据(图8-6中的A、B、C、D);二为一个表示下一结点的首地址的指针变量(图8-6结点中不加阴影的部分)。单链表一般设有一个头指针变量,用来存放第一个结点的地址,图8-6中用head表示。单链表中尾结点的指针指向NULL(表示空地址)。图8-6 单链表结构图ABC0Dhead2 结点定义 使用链表前首先要定义好该链表的结点类型,链表的
21、结点类型是一个结构体类型,该结构体除了包括用户要用的实际数据成员变量外,还包括一个指向自身类型的指针变量,往往用next给该指针变量命名,顾名思义,next表示下一个结点的地址的意思。通常也称这种结构体类型为自引用结构 。 单链表的结点的结构体类型定义类型定义的一般形式为: struct 结构体名结构体名 结构体其他成员表列结构体其他成员表列; /* 数据域 */ struct 结构体名结构体名 指针变量名指针变量名; /* 地址域 */ ;例:一个学生链表的结点的结构体类型定义如下: struct st int num; float score; struct st *next; ; 定义了
22、结点的类型后就可以用它来定义结点变量或指向该类型数据的指针变量了,比如: struct st stu, *p; p可以用如下语句赋值:p=&stu;其中:指针变量next是struct st类型中的一个成员,是指向自身结构体类型的指针变量。3 建立链表 建立链表是指在程序执行的过程中从无到有的创建一个链表,意味着反复创建一个一个的结点,并给这些结点建立起前后相连的关系,直到最后一个结点为止。 在C程序中用循环结构实现“反复”创建结点的过程。创建每个结点的过程可分为三步:第一步考虑新结点空间第一步考虑新结点空间的申请,第二步考虑给新申请到的结点的成员赋值,第的申请,第二步考虑给新申请到的结点的成
23、员赋值,第三步考虑如何把新结点插入到链表已经建好的部分三步考虑如何把新结点插入到链表已经建好的部分。 根据第三步提出的问题,创建单链表的方式可分为三种:第一种方式是新结点总是插到链表已建好部分的表头前;第二种方式是新结点总是接在链表已建好部分的表尾;第三种方式是按结点中某个成员的顺序规则创建一个有序的链表 。 例如现在要建立一个学生信息链表,该链表的结点类型定义如下:struct node int num; float score; struct node *next; 该结点类型名称为struct node,它包含两个数据域成员:num(学号)和score(分数)和一个地址域成员:next。
24、 下面给出了用三种方法创建学生信息表的三个函数,三个函数的共同点是:它们都是用循环结构实现创建过程,并约定当输入某个学生的学号为0时,结束循环即结束创建链表。创建链表的方法一(新结点总是插在表头前新结点总是插在表头前)struct node* create1( ) /*【例8.8】 */ struct node* head=NULL,*p; float f; while(1) p=(struct node*)malloc(sizeof(struct node); /* 申请新结点空间 */ scanf(%d,&p-num); /* 从键盘赋值给结点成员num */ if(p-num=0) br
25、eak; /* 若num为0结束创建过程 */ scanf(%f,&f);p-score=f; /* 从键盘赋值给结点成员score */ p-next=NULL; /* 给结点地址成员赋空值 */ p-next=head; /* 将新结点插到表头前 */ head = p; /* 使新结点成为新的表头 */ return head; /* 返回链表头指针 */ 创建链表的方法二(新结点总是插在表尾新结点总是插在表尾)struct node* create2( ) /*【例8.9】 */ struct node *head=NULL,*tail,*p; float f; while(1) p=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 第七 作业 答案 ppt 课件
限制150内