结构与其他自定义类型电子教案

上传人:yulij****0329 文档编号:140424568 上传时间:2020-07-29 格式:PPT 页数:69 大小:906KB
返回 下载 相关 举报
结构与其他自定义类型电子教案_第1页
第1页 / 共69页
结构与其他自定义类型电子教案_第2页
第2页 / 共69页
结构与其他自定义类型电子教案_第3页
第3页 / 共69页
结构与其他自定义类型电子教案_第4页
第4页 / 共69页
结构与其他自定义类型电子教案_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《结构与其他自定义类型电子教案》由会员分享,可在线阅读,更多相关《结构与其他自定义类型电子教案(69页珍藏版)》请在金锄头文库上搜索。

1、1,第 九 章 结构与其他自定义类型,2,9.1 结构类型的认识,回顾: 使用数组的好处是可以用一个变量定义逻辑上相关的一批数据,使每个分量具有相同的名字、不同的下标,但有一个限制,即一个数组变量包含的所有成分元素必须为同一类型,例如:int a3。,3,思考: 如果要存储若干学生的信息(如下表)使用数组可以吗?,5,9.2 结构类型的定义 形式:struct 结构名 成员表列; ;,struct date int year,month,day;,【例】定义代表日期信息、药品信息的结构类型。 struct date int year; int month; int day; ;,6,struc

2、t medicine char *code; char *name; float price; char *place; struct date validity; ;,结构类型medicine:,7,9.3 结构变量 9.3.1 结构变量 1.结构变量的定义,struct student long num; char name6; char sex; int score; char place12; ;,(1)先定义结构类型,再引用该类型定义的变量,struct student xia,ding,li;,8,(2)定义结构类型的同时说明变量,struct student long num;

3、char name6; char sex; int score; char place12; xia,ding,li;,9,2.结构变量的引用 结构变量通常都以成员的形式加以引用,结构变量成员的标记形式为:,成员运算符,【例】设有如下说明: struct date int year,month,day;,结构变量名.成员名,10,以下语句序列是对药品结构变量drug1、drug2进行赋值、输入和输出运算:,struct medicine char *code; char *name; float price; char *place; struct date validity; drug1,d

4、rug2;,11,drug1.name=“penicillin”;,drug1.price=6.38;,drug2.name=“vitamine C”;,if(drug2.code“99103x”) drug2.price=drug2.price-7.5;,scanf(“%d%d%d”,puts(drug1.name); puts(drug2.name);,12,3.结构变量的初始化 【例】结构变量在定义时被赋初值。,struct medicine char *code; char *name; float price; char *place; struct date validity; ;

5、,struct medicine drug1,drug2=“01-56p”,“vitamine C”, 22.65, “Shanghai”, 2002,12,31;,13,9.3.2 结构数组 1. 结构数组的定义,形式:结构类型 数组名常量表达式 struct date int year,month,day; ; struct medicine char *code; char *name; float price; char *place; struct date validity;,struct medicine drug10;,14,2.结构数组的引用 结构数组是以下标变量的成员名形式

6、加以引用的。其标记形式为:,for(i=0;iN;i+) gets(,结构数组名下标.成员名,【例】 #define N 100 struct student char *name; long num; int score; pN;,对数组pN赋初值的语句如下:,15,3.结构数组的初始化,与结构变量一样,结构数组也允许定义时被初始化。,【例】 struct student char *name; long num; int score; p = “Zhang san”,1001,536, “Li si”,1002,494, “Wang wu”,1003,501 ;,16,经过初始化以后,p数

7、组的存储结构和内容如下图所示:,p0,p1,p2,17,4.结构数组应用举例 【例】已知若干学生的姓名、学号和某单科考试成绩,试编写程序,对学生记录按考试成绩从高分至低分排序,程序输出排序以后的学生表,并报告姓名为(由键盘随即输入)的同学的名次号。 具体源程序代码见书P157,例9.5。,18,9.3.3 结构指针,定义一个指针,使其指向结构变量,这样的指针称为“结构指针”。,1.结构指针的定义 形式: 结构类型 *指针名,【例】struct product char code5;char name20; float price;int stock;,struct product x,y2,*

8、px=,19,px,x,py,y,y0,y1,*px=,20,形式: 指针名-成员名 或 (*指针名).成员名 【例】以上图为例,则以下语句都是通过结构指针引用结构变量的成员。,2.通过结构指针引用结构变量,21,px,x,py,y,y0,y1,(*px).price-=200;,pxprice-=200;,(+py)stock+=10;,1850,/*电冰箱降价200元*/,/*洗衣机库存加10*/,103,22,结构指针作为函数的参数使得结构变量也能像普通变量一样实现“传地址”调用。调用发生时,实参传递给形参的是自身结构的存储地址,使形式参数直接指向了实在实参,形参不再另占内存单元,从而使

9、函数体中对形式参数所作的改变就是对实在参数所作。,3.结构指针作为函数的参数,23,【例】已知10名学生的三门单科考试成绩,求每一门课程的总平均分。,24,25,26,运行结果为:,27,习题集,28,【例1】,运行结果为:,29,【例2】,运行结果为:,30,【例3】,31,【例4】见实验教程P66-程序改错。 【例5】见实验教程P66-程序填空。 【例6】见实验教程P59-程序填空。,32,9.4 动态数据结构“链表” 常用的动态数据结构(特点:需之则有,不需则无)有链表、树、图等等。,9.4.1 链表概述 1.什么是链表,顺序存储将逻辑上相邻的数据分配在物理上相邻的存储单元中,数据之间的

10、逻辑关系通过存储单元的邻接关系来体现;,链接存储将逻辑上相邻的数据分配在物理上离散的存储单元中,然后在每一个存储单元中粘贴一张标有相邻者存储地址的标签,使数据之间的逻辑关系通过地址的链接关系来体现。,33,2.链表实例 下图表示存放整数11,13,17,19的链表:,head,1079,1153,1286,1390,头结点,末结点,头指针,数据域,指针域,1079,1153,1286,1390,NULL,13,17,19,11,34,9.4.2 单链表结点的类型定义,数据域:存储数据,指针域:存储后续结点的地址,35,单链表结点的类型定义:,struct 结构名 数据成员表列; struct

11、结构名 *指针名; ;,head,1079,1153,1286,1390,36,【例】定义素数链表的结点类型struct prime。,素数链表:,head,要求素数链表结点只包含一个数据成员,因此结点类型可定义为: struct prime int data; struct prime *next; ;,37,【例】定义学生链表的结点类型struct student。 假设一个学生记录包括学号、姓名、性别和高考成绩,则学生链表的结点类型可定义为:,struct student long num; char *name; char sex; int score; struct student

12、*next; ;,struct student *p,*q;,38,struct student long num; char *name; char sex; int score; struct student *next; ;,struct student *p,*q;,p-num=010201;p-name=“倪桂兰”; p-sex=女;p-score=568;,q-num=010202;q-name=“刘宁宁”; q-sex=女;q-score=544;,p-next=q;,39,9.4.3 动态存储分配函数,2.calloc函数 函数原型:void *calloc(unsigned

13、n,unsigned size),1.malloc函数 函数原型:void *malloc(unsigned size) 函数功能:在内存的动态存储区中分配一块长度为size字节的连续空间,并返回该存储区域的首地址;若函数调用失败,返回空指针NULL。,40,函数功能:在内存的动态存储区中分配长度为size字节的连续空间n块,并返回该存储区域的首地址。若函数调用失败,就返回空指针NULL。,3.free函数 函数原型:void free(void *p) 函数功能:释放当前正被指针p所指向的内存区域,将它归还给系统以作它用。,41,9.4.4 创建链表,创建链表从空表开始,循环地将新结点逐一产

14、生出来,并按预定的链接关系插入到链表中去的过程。,head,42,结点插入通常有两种预定关系: “栈”式结构新结点总是从表首插入,使得最先插入到 链表中去的结点被挤压到链尾,成为末结点,而最后插入 的结点成为链表的头结点;,“队列”式结构新结点总是从表尾插入;,1)创建“栈”式链表,43,设head为链表头指针,p为创建动态结点的工作指针,则:, 建空表: headNULL;, 创建新结点, p=(结点类型*)malloc(结点长度) 并对结点的数据域赋值:, 新结点进栈: p-next=head;head=p;, 重复、步骤若干次;,head ,44,【例】用上述步骤往链表中插入两个结点:,

15、head ,45,【例】编写程序,建立一个存储字符及其ASCII码的链表,规定ASCII码的范围为m,n(32mn126),程序最后输出链表中全部结点的内容。,字符的ASCII码,字符,46,“栈”式链表的特点:先进后出,47,指针后移,48,运行程序:,49,2.创建“队列”式链表,队列式链表结点插入位置在链尾,头指针一旦指向了首结点后,就不会再动,而新结点插入链表时必须与末结点拉链,这就需要增加一个跟踪末结点的指针last。,现在假设head为头指针,p为创建新结点的工作指针,last为跟踪末结点的指针。,创建队列式链表的算法步骤:,50, 对末结点指针last初始化:lasthead;, 创建首结点,并对数据域赋值: head(结点类型*) malloc(结点长度);, 开辟后续新结点:p=(结点类型*) malloc(结点长度);,51, 新结点插入表尾:last-next=p;, last指针后移至末结点:lastlast-next;,52, 重复、步骤若干次,如下所示;, 开辟后

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

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