C语言程序设计-结构体与共用体

上传人:1505****484 文档编号:123519489 上传时间:2022-07-22 格式:PPT 页数:72 大小:1.68MB
返回 下载 相关 举报
C语言程序设计-结构体与共用体_第1页
第1页 / 共72页
C语言程序设计-结构体与共用体_第2页
第2页 / 共72页
C语言程序设计-结构体与共用体_第3页
第3页 / 共72页
点击查看更多>>
资源描述
2本章主要内容本章主要内容 结构体数据类型,共用体数据类型、枚举数据类型、结构体数据类型,共用体数据类型、枚举数据类型、定义数据类型的别名定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初始结构体变量、结构体数组、结构体指针的定义和初始化化 结构体成员的引用、成员选择运算符、指向运算符结构体成员的引用、成员选择运算符、指向运算符 向函数传递结构体变量、结构体数组、结构体指针向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表动态数据结构、动态链表312.1 从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型4 412.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型512.2.1 12.2.1 问题的提出问题的提出12.2.2 12.2.2 结构体类型(结构体模板)定义结构体类型(结构体模板)定义12.2.3 12.2.3 结构体变量的定义结构体变量的定义12.2.4 12.2.4 结构体变量的初始化结构体变量的初始化12.2.5 12.2.5 结构体变量的引用结构体变量的引用12.2.6 12.2.6 结构体数组结构体数组12.2.7 12.2.7 结构体指针结构体指针12.2.8 12.2.8 结构体作为函数参数结构体作为函数参数12.2 结构体结构体612.2.1 问题的提出问题的提出一个学生的信息有一个学生的信息有学号、姓名、性别、年龄、成绩学号、姓名、性别、年龄、成绩等等一本图书的信息有一本图书的信息有分类编号、书名、作者、出版社、分类编号、书名、作者、出版社、出版日期、价格、库存量出版日期、价格、库存量等等如何如何描述和管理描述和管理这些这些的的数据?(数据?(使用二使用二维数组行吗维数组行吗)问题:问题:712.2.1 问题的提出问题的提出解决方案:解决方案:812.2.1 问题的提出问题的提出2)2)使用一维数组使用一维数组张三张三李四李四王五王五赵六赵六麻七麻七FMFMF100110021003100410051921182019agenosexname分配内存不集中,寻址效率不高分配内存不集中,寻址效率不高;对数组赋初值时,易发生错位对数组赋初值时,易发生错位 ;结构显得零散,不易管理;结构显得零散,不易管理;90879687.576score912.2.1 问题的提出问题的提出解决方案:解决方案:C C 语言引入了称为结构体的数据存储方式语言引入了称为结构体的数据存储方式“结构体结构体”是一种构造数据类型,它是由若干数据项是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为组合而成的复杂数据对象,这些数据项称为结构体的结构体的成员成员。把把关系紧密关系紧密且且逻辑相关逻辑相关的多种不同类型的变量,的多种不同类型的变量,组织到统一的名字之下组织到统一的名字之下,占用占用相邻相邻的一段内存单元的一段内存单元1012.2.2 结构体类型定义结构体类型定义struct 结构体名结构体名 数据类型名数据类型名1 成员名成员名1;数据类型名数据类型名2 成员名成员名2;数据类型名数据类型名n 成员名成员名n;struct是是关键字关键字,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体成员类型可以是成员类型可以是基本型或构造型基本型或构造型以分号以分号;结尾结尾 struct Student char no9;/学号学号 char name20;/姓名姓名 char sex;/性别性别 unsigned int age;/年龄年龄 float score;/成绩成绩;struct Date short year;/年年 short month;/月月 short day;/日日;1112.2.2 结构体类型定义结构体类型定义struct Student char no9;/学号学号 char name20;/姓名姓名 char sex;/性别性别 short int age;/年龄年龄 float score;/成绩成绩;namenosexagescore9字节2字节20字节1字节4字节.结构体类型定义结构体类型定义描述结构的组织形式描述结构的组织形式 注意:注意:结构体类型只是用户结构体类型只是用户自定义的一种自定义的一种数据类型数据类型,用来定,用来定义描述结构的组织形式义描述结构的组织形式,不分配不分配内存内存,只有用它来定义某个变量,只有用它来定义某个变量时,才会为该变量分配结构类型时,才会为该变量分配结构类型所需要大小的内存单元。所需要大小的内存单元。1212.2.2 结构体类型定义结构体类型定义1312.2.3 结构体变量定义结构体变量定义struct 结构体类型名结构体类型名 数据类型名数据类型名1 成员名成员名1;数据类型名数据类型名n 成员名成员名n;struct 结构体类型名结构体类型名 变量列表变量列表;l 先定义结构类型,再定义结构变量先定义结构类型,再定义结构变量 struct Student char no9;char name20;char sex;unsigned int age;float score;struct Student stu1,stu2;定义一个类型为定义一个类型为 struct student 结构体的变量,将会为该结构体的变量,将会为该变量分配内存,变量分配内存,大小是等于其所有成员变量的大小之和。大小是等于其所有成员变量的大小之和。sizeof(struct Student)1412.2.3 结构体变量定义结构体变量定义l 定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量或或1512.2.3 结构体变量定义结构体变量定义成员可以是结构体,结构体可以嵌套成员可以是结构体,结构体可以嵌套 1612.2.4 结构体变量的初始化结构体变量的初始化 定义定义结构体变量时给结构体成员赋值结构体变量时给结构体成员赋值 1712.2.4 结构体变量的初始化结构体变量的初始化 定义定义结构体变量时给结构体成员赋值结构体变量时给结构体成员赋值 1812.2.5 结构体变量的引用结构体变量的引用 引用规则:引用规则:不能整体引用不能整体引用,只能引用变量的只能引用变量的成员成员引用方式:引用方式:结构体变量名结构体变量名.成员名成员名1912.2.5 结构体变量的引用结构体变量的引用 可以将可以将一个结构体变量赋值给另一个结构体变量一个结构体变量赋值给另一个结构体变量 结构体嵌套时结构体嵌套时逐级引用逐级引用 stu2=stu1;()stu1.birthday.month=12;2012.2.5 结构体变量的赋值结构体变量的赋值;2112.2.5 结构体变量应用举例结构体变量应用举例【例例】计算某个学生计算某个学生5 5门课的平均成绩,最高分和最低分门课的平均成绩,最高分和最低分运行结果运行结果(设设5门课的成绩为:门课的成绩为:75 80 86 90 68):avescore=79.8 maxscore=90.0 minscore=68.02212.2.6 结构体数组结构体数组 l元素为结构体类型的数组称为结构体数组。元素为结构体类型的数组称为结构体数组。l在实际应用中,经常用结构体数组来表示具有相同数据结构在实际应用中,经常用结构体数组来表示具有相同数据结构体的一个群体。例如一个班的学员档案,一个公司的职工档体的一个群体。例如一个班的学员档案,一个公司的职工档案等。案等。结构体数组的定义结构体数组的定义2312.2.6 结构体数组与二维表的对应关系结构体数组与二维表的对应关系结构体数组就相当于一张结构体数组就相当于一张二维表二维表,表的框架对应的就是某种,表的框架对应的就是某种结构体类型,表中的每一列对应该结构体的成员,表中每一结构体类型,表中的每一列对应该结构体的成员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行数行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。对应结构体数组的大小。结构体类型结构体类型StudentStudentstruct Student char no9;char name20;char sex;unsigned int age;float score;stu10;2412.2.6 结构体数组的初始化结构体数组的初始化基本格式:基本格式:struct 结构体类型结构体类型 数组数组size=初值表初值表1,初值表初值表n;分行初始化分行初始化顺序初始化顺序初始化2512.2.6 结构体数组的引用结构体数组的引用引用格式:引用格式:结构体数组名结构体数组名 下标下标.成员名;成员名;2612.2.6 结构体数组举例结构体数组举例【例例】统计侯选人选票(输入统计侯选人选票(输入0结束)结束)2712.2.6 结构体数组举例结构体数组举例 【例例12.3】利用结构体数组计算每个学生的平均分利用结构体数组计算每个学生的平均分282912.2.7 结构体指针结构体指针定义:定义:struct struct 结构体类型名结构体类型名 *指针变量名指针变量名;struct Student *p=&stu;结构体指针的引用:结构体指针的引用:指针变量名指针变量名-成员名成员名 或或 (*指针变量名指针变量名).成员名成员名stu.agestu.age=18;=18;(*p).agep).age=18;=18;p-p-ageage=18;=18;3012.2.7 指向结构体类型数据的指针指向结构体类型数据的指针3112.2.7 指向结构体数组的指针指向结构体数组的指针#include struct Student long int num;char name20;char sex;int age;void main()struct Student*p;struct Student stu=10101,李林李林,M,18,10102,张奋张奋,M,19,10103,王敏王敏,F,20;printf(学号学号 姓名姓名 性别性别 年龄年龄n);for(;p num,p-name,p-sex,p-age);3212.2.7 指向结构体数组的指针指向结构体数组的指针 10101李林李林M 18 10102张奋张奋M 19 10103王敏王敏F 20 p=stu p+1 p+2stu0stu1stu23312.2.8 结构体作为函数参数结构体作为函数参数q可以将结构体作为参数传递给函数,也可以定义可以将结构体作为参数传递给函数,也可以定义返回结构体值的函数。返回结构体值的函数。q结构体作为函数参数有三种不同方法:结构体作为函数参数有三种不同方法:q将结构体变量成员的值传递给函数处理。将结构体变量成员的值传递给函数处理。q将整个结构体变量作为参数值传递给函数。将整个结构体变量作为参数值传递给函数。q将结构体指针变量做函数的参数。将结构体指针变量做函数的参数。把结构体作为整把结构体作为整体来处理,但作体来处理,但作用方式和效果不用方式和效果不同。同。34整个结构体作为参数整个结构体作为参数struct date int year;int month;int day;void func(struct date p)p.year=2000;p.month=5;p.day=22;void main()struct date d;d.year=1999;d.month=4;d.day=23;printf(%d,%d,%dn,d.year,d.month,d.day);func(d);printf(%d,%d,%dn,d.year,d.month,d.day);1999,4,231999,4,2312.2.8 结构体作为函数参数结构体作为函数参数1999 4 23d1999 4 23p2000 5 22p35函数返回值为函数返回值为结构体结构体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;void main()struct date d;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%dn”,d.year,d.month,d.day);d=func(d);printf(“%d,%d,%dn”,d.year,d.month,d.day);12.2.8 结构体作为函数参数结构体作为函数参数1999,4,232000,5,221999 4 23d2000 5 22p1999 4 23p2000 5 22d36结构体指针做结构体指针做为为参数参数struct date int year;int month;int day;void func(struct date*p)p-year=2000;p-month=5;p-day=22;void main()struct date d;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%dn”,d.year,d.month,d.day);func(&d);printf(“%d,%d,%dn”,d.year,d.month,d.day);1999,4,232000,5,2212.2.8 结构体作为函数参数结构体作为函数参数p&d2000 5 22d1999 4 23d37 【例例12.7】修改例修改例12.3程序,用结构体数组作函数参数编程序,用结构体数组作函数参数编程并输出计算学生的平均分程并输出计算学生的平均分 12.2.8 结构体作为函数参数结构体作为函数参数3812.2.8 结构体作为函数参数结构体作为函数参数3912.2.8 结构体作为函数参数结构体作为函数参数4012.2.8 结构体作为函数参数结构体作为函数参数4112.3 共用体(共用体(P362-365)共用体(共用体(unionunion)又称联合体,又称联合体,把把情形互斥情形互斥但但逻逻辑相关辑相关的多种的多种类型类型的数据的数据组织在一起,组织在一起,共同占用同一共同占用同一段内存的用户自定义数据类型段内存的用户自定义数据类型。姓名性别 电话(男)住址(女)该栏目按该栏目按性别填写性别填写不同内容不同内容共用体4212.3 共用体共用体 共占共占4字节字节sizeof(union UData)=sizeof(f)4312.3 共用体共用体共用体与结构体的异同共用体与结构体的异同 共用体共用体与与结构体结构体都是由都是由多个成员分量多个成员分量组成的一个整体;组成的一个整体;共用体共用体与与结构体结构体在定义、说明和使用(成员引用、指针)在定义、说明和使用(成员引用、指针)上十分相似。上十分相似。结构体结构体:多个成员分量分别:多个成员分量分别占用占用不同不同的存储空间构成一个的存储空间构成一个整体;成员整体;成员分量分量之间是之间是相互独立的相互独立的,所进行的各种操作互,所进行的各种操作互不影响。不影响。共用体共用体:多个成员分量共同:多个成员分量共同占用同一占用同一存储空间;成员存储空间;成员分量分量之间是之间是相互联系相互联系的,所进行的操作相互依赖。的,所进行的操作相互依赖。共用体:共用体:同一内存单元在每一瞬时只能存放其中一种类型同一内存单元在每一瞬时只能存放其中一种类型的成员;起作用的成员是最后一次存放的成员,不能作为的成员;起作用的成员是最后一次存放的成员,不能作为函数参数,函数参数,不能进行比较操作,只能对第一个成员初始化不能进行比较操作,只能对第一个成员初始化44 4512.4 用用typedeftypedef定义数据类型定义数据类型(P343-344)标准类型标准类型(如(如intint、charchar、longlong、doubledouble等):系统已经定义等):系统已经定义好的数据类型,用户可以直接使用,无须再进行定义。好的数据类型,用户可以直接使用,无须再进行定义。用户自定义类型用户自定义类型:用户根据自己的实际要求,自己定义的新的:用户根据自己的实际要求,自己定义的新的数据类型。数据类型。除结构体、共同体等类型外,还可以用类型说明语句除结构体、共同体等类型外,还可以用类型说明语句typedeftypedef为为已定义类型说明符已定义类型说明符起别名。起别名。4612.4 用用typedeftypedef定义数据类型定义数据类型4712.5 枚举数据类型(枚举数据类型(P365-366)如果一个变量只有几种可能的值,可以把它定义成枚举如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓类型。所谓“枚举枚举”,顾名思义,就是把这种类型数据可取,顾名思义,就是把这种类型数据可取的值一一列举出来。的值一一列举出来。一个枚举型变量取值仅限于列出值的范一个枚举型变量取值仅限于列出值的范围围。枚举数据类型通常的定义形式为:。枚举数据类型通常的定义形式为:enum 枚举类型名枚举类型名 枚举元素表枚举元素表;由多个标识符组成,标由多个标识符组成,标识符之间用识符之间用逗号逗号分开分开 定义枚举类型:定义枚举类型:enum weekday sun,mon,tue,wed,thu,fri,sat;定义枚举类型变量:定义枚举类型变量:enum weekday today,nextday;enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;取值取值4812.5 枚举数据类型(枚举数据类型(P365-366)enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;today=sun;nextday=mon;if(today=sat)nextday=sun;today=100;C C编译对枚举元素实际上按编译对枚举元素实际上按整型常量整型常量处理,当遇到枚举处理,当遇到枚举元素列表时,编译程序就把其中元素列表时,编译程序就把其中第一个标识符赋第一个标识符赋0 0值,第二、值,第二、三、三、个标识符依此赋个标识符依此赋1,2,1,2,。enum weekday sun,mon,tue,wed,thu,fri,sat today,nextday;0123456today=sun;printf(today=%d,today);运行结果:运行结果:today=0 4912.5 枚举数据类型(枚举数据类型(P365-366)5012.6 动态数据结构动态数据结构 单向链表(单向链表(P366-376)5112.6 动态数据结构动态数据结构 单向链表单向链表struct Link int data;struct Link*next;datanextheaddatanextdatanextdataNULL52datanextheaddatanextdatanextdataNULL两部分信息组两部分信息组成一个节点成一个节点12.6 动态数据结构动态数据结构 单向链表单向链表53datanextheaddatanextdatanextdataNULL数据域:存储数据数据域:存储数据元素信息元素信息指针域:存储直接指针域:存储直接后继的节点信息后继的节点信息n个节点链接成一个链表(因为只包含一个指针域,故又个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单向链表)称线性链表或单向链表)12.6 动态数据结构动态数据结构 单向链表单向链表5412.6链表的基本操作链表的基本操作-的建立的建立data=Anodedata=Bnodedata=Cnodehead 向链表中添加一个新节点向链表中添加一个新节点55 若原链表为空表若原链表为空表(head=NULL),则将新建,则将新建节节点点p置为头节点置为头节点 headdatanext p(2)pr=ppr(3)pr-next=NULL12.6链表的基本操作链表的基本操作-的建立的建立56datanextp 若原链表为非空,则将新建节点若原链表为非空,则将新建节点p添加到表尾添加到表尾(2)pr=pheaddataprpr(3)pr-next=NULLnext12.6 链表的基本操作链表的基本操作-的建立的建立5758 若原链表为空表,则退出程序若原链表为空表,则退出程序 若待删除节点若待删除节点p是头节点,则将是头节点,则将head指向当前节指向当前节点的下一个节点即可删除当前节点点的下一个节点即可删除当前节点 datanextheaddatanext p从链表中删除一个节点从链表中删除一个节点12.6链表的基本操作链表的基本操作-的删除的删除59 若待删除节点不是头节点,则将前一节点的指针若待删除节点不是头节点,则将前一节点的指针域指向当前节点的下一节点即可删除当前节点域指向当前节点的下一节点即可删除当前节点datanextdatanextdatanext pdatanext 12.6链表的基本操作链表的基本操作-的删除的删除 若原链表为空表,则将新节点若原链表为空表,则将新节点p作为头节点,让作为头节点,让head指向新节点指向新节点p headdata p12.6链表的基本操作链表的基本操作-的插入的插入62 若原链表为非空,则按节点值(假设已按升序排若原链表为非空,则按节点值(假设已按升序排序)的大小确定插入新节点的位置序)的大小确定插入新节点的位置 若在头节点前插入新节点,则将新节点的指针域若在头节点前插入新节点,则将新节点的指针域指向原链表的头节点指向原链表的头节点,且让且让head指向新节点指向新节点headdatanext pdatanextdatanextdata12.6链表的基本操作链表的基本操作-的插入的插入63datanext 若在链表中间插入新节点,则将新节点的指针域若在链表中间插入新节点,则将新节点的指针域指向下一节点且让前一节点的指针域指向新节点指向下一节点且让前一节点的指针域指向新节点datanext pdatanextdatanextdatapr12.6链表的基本操作链表的基本操作-的插入的插入datanext 若在表尾插入新节点,则末节点指针域指向新节若在表尾插入新节点,则末节点指针域指向新节点点datanext pprdatanext12.6链表的基本操作链表的基本操作-的插入的插入67 遍历链表的所有节点遍历链表的所有节点headdatanextdatanextdatapppp12.6链表的基本操作链表的基本操作-的输出的输出68n对于动态链表,必须由程序员自己来进行内存对于动态链表,必须由程序员自己来进行内存的分配与释放。的分配与释放。void DeleteMemory(struct Link *head)struct Link *p,*q;p =head;while(p !=NULL)q =p;p =p-next;free(q);12.6链表的基本操作链表的基本操作-的的释放释放6912.6 链表的类型链表的类型7012.6 链表的类型链表的类型环形链表:一种特殊的链表,其尾结点的next指针,又指向了链表的首结点,从而形成了一个圆环。从环形链表的任何一个结点出发,都可以遍历整个的链表。7172 结束语结束语
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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