单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2017/12/12,#,滁州学院 计算机与信息工程学院,单击此处编辑母版标题样式,第章结构体,第章结构体,第章结构体第章结构体,1,本章主要内容,结构体类型的概念与定义。,结构体变量的定义、初始化及结构成员的引用。,结构体数组的定义及其使用。,结构体类型指针的定义及其使用。,结构体变量作为函数的参数。,返回结构体类型值的函数。,单链表及其应用。,本章主要内容结构体类型的概念与定义。,2,本章学习目标,理解结构体类型的概念及其定义方法。,掌握结构体变量的定义和初始化。,掌握结构体成员的引用方法。,掌握结构体数组的定义和使用。,掌握结构体在函数中的应用。,理解链表的概念及其基本操作。,本章学习目标理解结构体类型的概念及其定义方法。,3,目录,引例,结构体的概念与定义,结构体变量的定义和引用,结构体数组,结构体变量与指针,结构体与函数,单链表及其应用,实例,目录 引例,4,引例,引例:假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩。要求输入个学生信息,计算并输出平均分最高的学生信息。,学生,n,学生,2,学生,1,学号,姓名,英语,数学,物理,平均,问题:不能用二维数组,因为每个成员的类型不一致。,问题:如果定义多个相互独立的一维数组,则难以反映出同一名学生各成员数据之间的内在联系。,内存分布图,解决方案:引入结构体数据类型,引例引例:假设学生的基本信息包括学号、姓名、三门课程成绩以,5,结构体的概念与定义,结构体是一种允许程序员把一些数据分量(结构成员)聚合成一个整体的数据类型。,学号,姓名,英语,数学,物理,平均,成员,单元,数组的所有元素的数据类型必须相同,而结构体类型所包含的成员数据类型可以互不相同。,结构体类型的概念,结构体与数组的区别,结构体类型的定义,结构体类型名,类型名 成员名;,类型名 成员名;,类型名 成员名;,;,;,;,;,;,;,;,练习,结构体的概念与定义结构体是一种允许程序员把一些数据分量(结,6,结构体的概念与定义嵌套定义,增加一个结构体生日类型,结构体类型嵌套定义,;,;,;,;,;,;,;,;,;,;,;,练习,结构体的概念与定义嵌套定义增加一个结构体生日类型结构体类型,7,结构体变量的定义和引用定义,;,;,;,;,;,*;,先定义结构体类型,然后定义结构体变量,;,;,;,;,*;,结构体变量定义,同时定义结构体类型和结构体变量,直接定义结构体变量,;,;,;,;,*;,推荐使用这种形式的定义,结构体变量的定义和引用定义 先定义结构体类型,然后定义结,8,结构体变量的定义和引用初始化,结构体变量初始化,;,;,;,;,;,;,;,;,;,;,;,结构体变量的定义和引用初始化结构体变量初始化,9,;,(,);,;,;,;,结构体变量的定义和引用引用,;,;,;,;,;,;,结构体变量成员引用,s,成员如何表示?,结构体变量名.成员名,s.num,s.name,s.math,s.average,举例说明,结构体成员赋值,801,Zhang,80,89,92,结构体变量赋值,;,;结构体变量的定义和引用引用 结构体变量成员引用s成员如,10,结构体变量的定义和引用例,例 阅读程序,理解结构体变量的定义和引用,给出运行结果,;,(),;,();,;,(,);,;,;,();,();,();,;,18,M,1.75,70.5,ZhangSan,p1,18,M,1.72,68,WangMing,p3,结构体变量的定义和引用例例 阅读程序,理解结构体变量的定,11,结构体变量的定义和引用输入输出,(,);,结构体变量数据输入,;,;,;,;,;,;,s,数据如何输入输出?,结构体变量数据输出,(,);,注意:没有符号,结构体变量的定义和引用输入输出(,结构体变量数据输入,12,结构体变量的定义和引用例分析,例 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩。输入个学生的成绩信息,计算并输出平均分最高的学生信息。,学生,n,学生,2,学生,1,学号,姓名,英语,数学,物理,平均,所有学生共用存储单元,存储分析,算法设计,定义结构体类型和变量,循环输入每一个学生的信息,计算平均成绩,判断是否是最高分,输出最高分的学生信息,结构体变量的定义和引用例分析例 假设学生的基本信息包括学,13,结构体变量的定义和引用例程序,例 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩。输入个学生的成绩信息,计算并输出平均分最高的学生信息。,;,(),;,;,();,(,);,;,(),();,();,(,);,();,练习,结构体变量的定义和引用例程序例 假设学生的基本信息包括学,14,结构体数组,结构体数组定义,结构体类型名 数组名数组长度;,;,;,;,;,;,;,;,结构体数组初始化,;,结构体数组结构体数组定义结构体类型名 数组名数组长度,15,结构体数组例分析,例 编写一个可以统计候选人得票数的程序。设有个候选人,人投票,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,候选人,3,候选人,2,候选人,1,姓名,票数,存储分析,算法设计,定义结构体类型、结构体数组并初始化,循环输入每个人投票的候选人姓名,根据姓名增加对应的选票数,循环输出每个候选人的得姓名及其选票数,结构体数组例分析例 编写一个可以统计候选人得票数的程序。,16,结构体数组例程序,;,;,(),;,;,;,(),(),();,();,(),(),;,例 编写一个可以统计候选人得票数的程序。设有个候选人,人投票,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,练习,结构体数组例程序 ()()(num,sp-,name,sp-,math,sp-,average,结构体变量与指针结构体变量 s结构体变量指针的定义结构体类,18,结构体变量与指针结构体数组,;,;,;,;,;,;,s,结构体变量指针的定义,结构体类型名*结构体指针变量名;,*;,;,sp,如何间接访问?,成员引用,(*sp).num,(*,sp).name,(*,sp).math,(*,sp).average,sp-num,sp-,name,sp-,math,sp-,average,;,结构体变量与指针结构体数组 s结构体变量指针的定义结构体类,19,结构体变量与指针例,例 阅读程序,理解指向结构体数组指针的应用,给出运行结果,;,(),;,;,;,*;,;,(;,;,sp,sp,sp,sp,sp,练习,结构体变量与指针例例 阅读程序,理解指向结构体数组指针的应,20,t,分配新空间,结构体与函数,结构体变量作为函数参数,主调,函数,被调函,数,回顾函数的传值调用,;,;,;,;,;,;,s,1001,t分配新空间 结构体与函数 结构体变量作为函数参数主调函,21,结构体与函数例,例 一个复数包括实部和虚部,请定义一个复数结构体,并调用 (,)计算并返回两个复数的乘积。,算法设计,定义结构体类型,定义主函数完成变量定义、输入、调用函数、结果输出,定义子函数计算两个复数的乘积并返回结果,;,(),;,();,();,;,(,),;,*;,*;,;,结构体与函数例例 一个复数包括实部和虚部,请定义一个复数,22,结构体与函数,结构体指针变量作为函数参数,回顾函数的传地址调用,;,;,;,;,;,;,主调,函数,被调函,数,s,1001,sp,分配一个地址空间,实现间接访问,优点:分配少量空间以及传递少量的数据,可以传递结,构体数组名,EX9.9,EX9.8,结构体与函数 结构体指针变量作为函数参数回顾函数的传地,23,结构体与函数例,例 输入个学生的成绩信息,再输入一个学生的学号、课程序号以及成绩,在自定义函数中修改该学生指定课程的成绩。,算法设计,定义结构体类型,定义主函数完成变量定义、输入、调用函数、结果输出,定义子函数完成修改学生指定课程的成绩,;,(),;,();,;,;,(*),;,();,();,();,;,p,p,p,p,练习,结构体与函数例例 输入个学生的成绩信息,再输入一个学生的,24,单链表及其应用动态存储分配,25,动态存储分配,;,;(“”);,?,无法实现按需分配存储单元,举例说明,(*)(*();,(*)(,();,(*)(*();,();,p,0,1,2,3,4,5,6,7,#include,free,malloc,calloc,realloc,0,1,2,78,79,单链表及其应用动态存储分配25动态存储分配;,单链表及其应用例,算法设计,定义结构体类型和指针变量,申请空间,数据输入、数据输出,释放空间,;*;,(),*;,();,();,;,(*)();,;,例 动态分配一块区域,输入输出一个学生数据。,单链表及其应用例算法设计定义结构体类型和指针变量申请空间数,单链表及其应用单链表基本概念,27,;,0,1,2,3,4,5,6,7,存在问题,存储空间不能进行动态伸缩,插入、删除元素需要移动大量的元素,使用链式存储结构:链表(本教材只介绍单链表),单链表基本概念,结点,头指针,空指针,数据域,指针域,问题,结点类型如何定义?,单链表如何建立?,单链表如何遍历?,A,1356,1249,1249,head,B,1475,1356,C,1021,1475,D,NULL,1021,1021,tail,尾,指,针,单链表及其应用单链表基本概念27;0存在问题存储空间,单链表及其应用结点类型定义,结点,数据域,指针域,A,1356,1249,1249,head,B,1475,1356,C,1021,1475,D,NULL,1021,;,*;,;,递归定义,课堂练习:定义一个结点类型,要求有学生的学号、姓名和成绩成员。,;,;,;,*;,;,单链表及其应用结点类型定义结点数据域指针域A1356124,单链表及其应用建立链表算法设计,29,;*;,学生结点类型定义,*();,函数首部,算法设计,定义头指针变量和尾指针变量并进行初始化,输入数据,申请空间并赋值,尾部插入(分情况),返回头指针,循环处理,A,1356,1249,1249,head,B,1475,1356,C,1021,1475,D,NULL,1021,1021,tail,单链表及其应用建立链表算法设计29 ;,单链表及其应用建立链表函数代码,30,*(),*,*,*;,;,();,;,();,(),(*)();,;();,();,();,;,NULL,NULL,head,p,NULL,head,tail,NULL,p,NULL,tail,单链表及其应用建立链表函数代码30 *()();(,单链表及其应用链表遍历算法设计,31,A,1356,1249,1249,head,B,1475,1356,C,1021,1475,D,NULL,1021,1021,tail,31,*(*);,函数首部,算法设计,定义指针变量,初始化指针变量,输出数据,移动指针变量,循环处理,head,head,head,head,单链表及其应用链表遍历算法设计31A13561249124,单链表及其应用链表遍历函数代码,(*),*;,(;),();,(),*;,;,();,();,单链表及其应用链表遍历函数代码(*)(;)(,本章小结,本章主要内容有结构体类型的概念与定义,结构体变量的定义和使用,结构体数组的定义和使用,结构体类型指针变量的定义和使用,结构体变量、结构体指针变量和数组作为函数的参数和返回值,单,链表,的基本概念,及其,建立和遍历,操作,等,。,通过本章的学习,使学生掌握定义结构体类型的方法,能够根据需要正确定义和使用结构体变量、结构体数组和结构体指针,能够使用结构体和链表编写,较复杂,的,综合,程序。,本章小结本章主要内容有结构体类型的概念与定义,结构体变量的定,33,