c语言第十二章(苏小红版)

上传人:小*** 文档编号:242962428 上传时间:2024-09-12 格式:PPT 页数:60 大小:3.66MB
返回 下载 相关 举报
c语言第十二章(苏小红版)_第1页
第1页 / 共60页
c语言第十二章(苏小红版)_第2页
第2页 / 共60页
c语言第十二章(苏小红版)_第3页
第3页 / 共60页
点击查看更多>>
资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,2024/9/12,60,/60,第,12,章 结构体与共用体,哈尔滨工业大学,计算机科学与技术学院,苏小红,sxh,本章学习内容,结构体数据类型,共用体数据类型、枚举数据类型、定义数据类型的别名,结构体变量、结构体数组、结构体指针的定义和初始化,结构体成员的引用、成员选择运算符、指向运算符,向函数传递结构体变量、结构体数组、结构体指针,动态数据结构、动态链表,二进制数,类型本不存在,内存里存的内容,你认为它是什么,它就是什么,在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念,一般的,CPU,只支持两种类型,整数、浮点数,12.1,从基本数据类型到抽象数据类型,在高级语言引入了基本数据类型,整型、浮点型、字符型等,不同语言会定义不同的基本类型,基本数据类型并不能方便地解决所有问题,有些语言(如,PL/1,)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,12.1,从基本数据类型到抽象数据类型,用户自己构造数据类型,复合数据类型,由基本数据类型迭代派生而来,表示复杂的数据对象,典型的代表就是,“,结构体,”,抽象数据类型(,Abstract Data Type,,,ADT,),在复合数据类型基础上增加了对数据的操作,抽象数据类型进而进化为“类,(Class)”,这是一个跨时代的进步,Class,是,Object-Oriented,的一个重要概念,12.1,从基本数据类型到抽象数据类型,12.2,结构体的定义,12.2.1,为什么要定义结构体类型,在程序里表示一个人(姓名、年龄、性别,),怎么表示?,想表示多个人呢?,如何用计算机程序实现下述表格的管理?,数组的解决方法,数组的解决方法,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高,对数组赋初值时,易发生错位,结构显得零散,不易管理,希望的内存分配图,结构体,类型,的声明,声明了一个结构体类型,构成结构体的变量称为结构体的成员,(Structure Member),结构体的名字称为结构体标签,(Structure Tag),结构体,类型,的声明,结构体模板,(Structure Template),Dont forget the,semicolon,!,形成一个类型声明的样板,用于生成结构体变量,但并未声明结构体变量,因而编译器不为其分配内存,(,1,)先定义结构体类型,再定义变量名,(,2,)在定义类型的同时定义变量,(,3,)直接定义结构体变量(不指定结构体标签),12.2.2,结构体,变量,的定义,12.2.3,用,typedef,定义数据类型,struct,student,stu1, stu2;,/*It works*/,student,stu1, stu2;,/*Can this work?*/,struct,stu1, stu2;,/*Can this work?*/,STUDENT,stu1, stu2;,/*It works!*/,关键字,typedef,为一种,已存在的,类型定义一个,别名,,并未定义新类型,STUDENT,与,struct student,类型是,同义词,等价于,12.2.4,结构体变量的初始化,等价于,注意!,嵌套的结构体(,Nested Structure,)就是在一个结构体内包含了另一个结构体作为其成员,12.2.5,嵌套的结构体,结构体定义,可以嵌套,访问结构体变量的成员必须使用,成员选择运算符,(也称圆点运算符),12.2.6,结构体变量的引用,当出现结构体嵌套时,必须以级联方式访问结构体成员,【,例,12.1】,演示结构体变量的赋值和引用方法,12.2.6,结构体变量的引用,按结构体的成员顺序逐一对相应成员进行赋值,格式符,%02d,中,2d,前面的前导符,0,表示输出数据时,若左边有多余位,则补,0,【,例,12.1】,若要从键盘输入结构体变量,stu1,的内容,那么程序如何修改?,两个地址有何不同?,【,例,12.1】,若要从键盘输入结构体变量,stu1,的内容,那么程序如何修改?,结构体成员的地址与该成员在结构体中所处的位置及其所占内存的字节数相关,结构体变量的地址,&stu2,是该变量所占内存空间的首地址,12.2.7,结构体所占内存的字节数,struct,类型用内存字节数,= ?,是所有成员变量的内存总和吗?,printf(%dn, sizeof(,struct,sample,);,用运算符,sizeof,获得结构体大小,sizeof,(,变量或表达式,),sizeof,(,类型,),12,Why?,printf(%dn, sizeof(,SAMPLE,);,【,例,12.2,】,12.2.7,结构体所占内存的字节数,事实上,所有数据类型在内存中都是从,偶数,地址开始存放的,且结构所占的实际空间一般是按照机器字长对齐的,不同的编译器、平台,对齐方式会有变化,结构体变量的成员的存储,对齐规则,是与机器相关的,具有特定数据类型的,数据项大小,也是与机器相关的,所以一个结构体在内存中的存储格式也是与机器相关的,非所有成员变量的内存总和,12,个字节,ch,f,ch,ch,ch,f,12.3,结构体,数组,的定义和初始化,12.3,结构体,数组,的定义和初始化,建立了数据库中的多条记录,每条对应一个学生信息,【,例,12.3】,利用结构体数组计算每个学生的平均分,12.4,结构体,指针,的定义和初始化,pt,stu1,STUDENT,stu1;,STUDENT,*,pt;,pt =,&,stu1;,成员,1,成员,2,成员,3,成员,4,成,员,5,如何定义指向,结构体变量,的指针?,STUDENT,*,pt =,&,stu1;,等价于,12.4,结构体,指针,的定义和初始化,如何访问,结构体指针变量,所指向的结构体成员呢?,STUDENT,stu1;,STUDENT,*,pt =,&,stu1;,pt,stu1,成员,1,成员,2,成员,3,成员,4,成,员,5,通过,s,tu1,和,成员选择运算符,访问结构体成员,stu1.,studentID = 1;,通过,pt,和,指向运算符,访问结构体成员,(*pt).,studentID = 1;,pt -,studentID = 1;,12.4,结构体,指针,的定义和初始化,pt,stu1,成员,1,成员,2,成员,3,成员,4,成,员,5,当结构体,嵌套,时,如何访问结构体指针变量所指向的结构体成员?,stu1.,birthday.,year = 1999;,(*pt).,birthday.,year = 1999;,pt -,birthday.,year = 1999;,STUDENT,stu1;,STUDENT,*,pt =,&,stu1;,12.4,结构体,指针,的定义和初始化,STUDENT,stu30;,STUDENT,*,pt;,pt = stu;,如何定义指向,结构体数组,的指针?,STUDENT,*,pt = stu;,等价于,STUDENT,*,pt = ,等价于,pt,stu30,stu0,stu1,stu2,stu3,stu4,stu5,.,stu29,使用,pt+,,使,pt,指向,stu1,pt -,studentID,等价于,stu1.,studentID,pt,12.4,结构体,指针,的定义和初始化,STUDENT,stu30;,STUDENT,*,pt = stu;,如何访问,结构体数组指针,指向的结构体成员?,stu30,stu0,stu1,stu2,stu3,stu4,stu5,.,stu29,12.5,向函数传递结构体,向函数传递结构体的,单个成员,复制单个成员的内容,函数内对结构内容的修改不影响原结构,向函数传递结构体的,完整结构,向函数传递结构体的,首地址,struct,date,int,year;,int,month;,int,day;,;,void,Func(,struct date,p,),p.,year = 2000;,p.,month = 5;,p.,day = 22;,Before function call:1999/04/23,After function call:1999/04/23,结构体,变量,作函数参数,【,例,12.4】,struct,date,int,year;,int,month;,int,day;,;,void,Func(,struct date,*p,),p-,year = 2000;,p-,month = 5;,p-,day = 22;,Before function call:1999/04/23,After function call:,2000/05/22,结构体,指针,作函数参数,指针作函数形参,实参必须为地址值,【,例,12.5】,struct,date,int,year;,int,month;,int,day;,;,struct date,Func(,struct date,p,),p.,year = 2000;,p.,month = 5;,p.,day = 22;,return p;,Before function call:1999/04/23,After function call:,2000/05/22,结构体变量作函数,返回值,【,例,12.6】,12.5,向函数传递结构体,向函数传递结构体的完整结构,复制整个结构体成员的内容,多个值,函数内对结构内容的修改不影响原结构,内容传递更直观,但,开销大,向函数传递结构体的首地址,用,结构体数组,/,结构体指针作,函数参数,仅复制结构体的首地址,一个值,修改结构体指针所指向的结构体的内容,指针传递效率高,12.5,向函数传递结构体,【,例,12.7】,修改例,12.3,程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5,向函数传递结构体,【,例,12.7】,修改例,12.3,程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5,向函数传递结构体,【,例,12.7】,修改例,12.3,程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5,向函数传递结构体,【,例,12.7】,修改例,12.3,程序,用结构体数组作函数参数,编程并输出计算学生的平均分,用户自定义的数据类型,结构体,(,Struct,),把,关系紧密,且,逻辑相关,的多种,不同类型,的变量,组织到统一的名字之下,占用,相邻,的一段内存单元,共用体,也称联合,(,Union,),把,情形互斥,但,逻辑相关,的多种,不同类型,的变量,组织到统一的名字之下,占用,同一段,内存单元,每一时刻只有一个数据起作用,12.6,共用体,struct,sample,short,i;,char,ch;,float,f;,;,0x0037b00,union,sample,short,i;,char,ch;,float,f;,;,printf(%dn, sizeof(struct sample);,8,个字节,i,ch,f,4,个字节,printf(%dn, sizeof(union sample);,i,ch,f,【,例,12.8】,12.6,共用体,sizeof(union number),取决于,占空间最多,的那个成员变量,0x0037b00,同一内存单元在每一瞬时只能存放其中一种类型的成员,起作用的成员是,最后一次存放,的成员,不能作为函数参数,不能进行比较操作,只能对第一个成员初始化,f,4,个字节,12.6,共用体,12.6,共用体,12.7,枚举数据类型,枚举,(,Enumeration,),数据类型,描述的是一组整型值的集合,用于当某些量仅由有限个数据值组成时,enum,weeks SUN, MON, TUE, WED, THU, FRI, SAT;,enum,weeks,today,;,enum,response no, yes, none;,enum,response,answer,;,today,= TUE;,answer,= yes;,enum,response no = -1, yes = 1, none = 0;,其值为,2,其值为,1,下面的结构是什么意思?,struct,temp,int,data;,struct,temp pt;,CB,下的错误提示:,field pt has incomplete type,VC,下的错误提示:,pt uses undefined struct temp,下面的结构是什么意思呢?,struct,temp,int,data;,struct,temp *pt;,结构体声明时不能包含本结构体类型成员,,系统将无法为这样的结构体类型分配内存,可包含指向本结构体类型的指针变量,问题的提出,12.8,动态数据结构,单向链表,struct,Link,int,data;,struct,Link *next;,;,data,next,head,data,next,data,next,data,NULL,链表,(,Linked Table,),:,线性表的链式存储结构,特点:用一组任意的存储单元存储线性表的数据;存储单元可以是连续的,也可是不连续的,链表的定义,data,next,head,data,next,data,next,data,NULL,链表,(,Linked table,),:,线性表的链式存储结构,为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息,两部分信息组成一个节点,struct,Link,int,data;,struct,Link *next;,;,data,next,head,data,next,data,next,data,NULL,数据域:存储数据元素信息,指针域:存储直接后继的节点信息,链表的定义,链表,(,Linked Table,),:,线性表的链式存储结构,为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息,struct,Link,int,data;,struct,Link *next;,;,n个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单向链表),链表的建立,向链表中添加一个新节点,data = A,node,data = B,node,data = C,node,head,空指针,NULL,表示链表结尾,链表的头指针:访问链表的关键,链表的建立,若原链表为空表,(head = NU,LL),,则将新建,节点,p,置为头节点,head,(1)head = p,data,n,ext,p,新建节点,(2) pr = p,pr,(3) pr-next = NULL,data,n,ext,新建节点,p,链表的建立,若原链表为非空,则将新建节点,p,添加到表尾,(1) pr-next = p,(2) pr = p,head,data,pr,pr,(3) pr-next = NULL,n,ext,链表的删除操作,若原链表为空表,则退出程序,若待删除节点,p,是头节点,则将,head,指向当前节点的下一个节点即可删除当前节点,data,n,ext,(1) head = p-next,head,待删除节点,data,n,ext,p,头节点,(,2,),free(p),链表的删除操作,若待删除节点不是头节点,则将前一节点的指针域指向当前节点的下一节点即可删除当前节点,(1) pr-next = p-next,data,n,ext,data,n,ext,待删除节点,data,n,ext,p,中间节点,data,n,ext,若已搜索到表尾,(,p-next = NULL,),仍未找到待删除节点,则显示“未找到”,(,2,),free(p),链表的插入操作,若原链表为空表,则将新节点,p,作为头节点,让,head,指向新节点,p,head,待插入节点,data,p,(1) head,= p,p = (struct link *)malloc(sizeof(struct link);,p-next = NULL;,p-data = nodeData;,链表的插入操作,若原链表为非空,则按节点值(假设已按升序排序)的大小确定插入新节点的位置,若在头节点前插入新节点,则将新节点的指针域指向原链表的头节点,,,且让head指向新节点,head,待插入节点,data,n,ext,p,(2) head = p,data,n,ext,data,n,ext,data,(1) p-next = head,data,n,ext,链表的插入操作,若在链表中间插入新节点,则将新节点的指针域指向下一节点且让前一节点的指针域指向新节点,待插入节点,data,n,ext,p,(2) pr-next = p,data,n,ext,data,n,ext,data,(1) p-next = pr-next,pr,data,n,ext,链表的插入操作,若在表尾插入新节点,则末节点指针域指向新节点,待插入节点,data,n,ext,p,(1) pr-next = p,pr,data,原末节点,n,ext,链表的输出,遍历链表的所有节点,head,data,n,ext,data,n,ext,data,p,p,p,p,Questions and answers,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!