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