




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章 结构体与共用体,学习目标,学会建立和使用结构体、共同体。 能够为数据对象动态分配和释放内存。 能够建立和操作链表。 理解链式数据结构的应用。,11.1 引言 数组是一组同类型的数据集合。 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型,11.2结构体类型及其变量的定义和初始化 11.2.1 结构体类型定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,例 struct student int number; char name20; char sex; int age; ;,结构体类型定义描述结构 的组织形式,不分配内存,定义结构体类型时要注意以下几点: 1)结构体成员可以是任何基本数据类型,也可以是数组、指针类型。 如上例中的name成员为字符数组类型,sex成员为字符指针成员。 2)结构体类型可以嵌套定义,结构体中的成员可以是其它结构体类型。 3)定义的结构体类型,在编译时系统不对类型分配内存空间。,struct DATE int year; / 年 int month; / 月 int day; / 日 ;,struct student long int number; /学号 char name8; /姓名 int age; /年龄 char *sex; /性别 struct DATE birthday; / 出生日期 结构体嵌套定义 ;,例 struct student int number; char name8; char sex; int age; struct DATE birthday; ; struct student stu1,stu2;,11.2.2 结构体变量的定义 先定义结构体类型,再定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 变量名表列;,例 #define STUDENT struct student STUDENT int number; char name8; char sex; int age; struct DATE birthday; ; STUDENT stu1,stu2;,定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student int number; char name8; char sex; int age; struct DATE birthday; stu1,stu2;,直接定义结构体变量 一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct int number; char name8; char sex; int age; struct DATE birthday; stu1,stu2;,用无名结构体直接定义 变量只能一次,11.2.3 结构体变量的引用和初始化,如果一个结构体类型中又嵌套一个结构体类型, 访问该类型的变量时应采取逐级访问的方法, 直到得到所需访问的成员为止。 例如: stu1.birthday.year stu1.birthday.month,2)对整个结构体变量的引用,相同类型的结构体变量可以整体赋值 例如: struct student stu1,stu2; stu1=stu2;,【例11-1】 结构体类型变量的引用示例。 #include struct DATE int year; / 年 int month; / 月 int day; / 日 ; struct student long int number; / 学号 char name8; / 姓名 int age; / 年龄 char sex2; / 性别 struct DATE birthday; / 出生日期 结构体嵌套定义 ;,void main() struct student st1; / 声明结构体变量 scanf(“%ld“, ,11.2.3 结构体变量的引用和初始化 形式一:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量=初始数据;,例 struct student int number; char name8; char sex; ; struct student stu1=110,“Lin Ping”,F;,形式二:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct student int num; char name8; char sex; stu1=110,“Lin Ping”,F;,形式三:,struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct int num; char name8; char sex; stu1=112,“Lin Ping”,F;,11.3 结构体数组 结构体数组的定义,struct student int num; char name8; char sex; int age; ; struct student stu2;,struct student int num; char name8; char sex; int age; stu2;,结构体数组初始化,例 struct int num; char name20; char sex; int age; stu =,;,顺序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int num; char name20; char sex; int age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,11.4 结构体指针 指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,使用结构体指针变量引用成员形式,用指向结构体的指针作函数参数 用结构体变量的成员作参数-值传递 用指向结构体变量或数组的指针作参数-地址传递 用结构体变量作参数-多值传递,效率低,11.5 用结构体变量作函数参数,【例11-5】将例11-2中输出功能用函数print 实现。 #include struct student /定义结构体类型 long int number; / 学号 char name8; / 姓名 float score2; /2门课程的成绩 ; void print(struct student stud) /定义输出函数print int j; printf(“%ld %7s “,stud.number,); for(j=0;j2;j+) printf(“%7.1f “,stud.scorej); printf(“n“); ,void main() struct student stud3; /定义结构体数组 int i,j; /输入 for(i=0;i2;i+) scanf(“%ld“, /调用输出函数print ,例 结构体指针变量作为函数参数,【例11-6】将例11-4中输出功能用函数print实现。 #include struct student /定义结构体类型 long int number; / 学号 char name8; / 姓名 float score2; /2门课程的成绩 ; void print(struct student *sp) /定义 print 函数 int j; printf(“%ld%7s“,sp-number,sp-name); for(j=0;jscorej); printf(“n“); ,void main() struct student stud3= 230401,“李立”,80,89, 230402, “王平“,79,87, 230403,“赵宏“,88,86; int i; printf(“n学号 姓名 数学 英语n“); for(i=0;i3;i+) print( /调print 函数 ,11.7 链表,x1 1222,头指针,1876,x4 0,struct node int x; struct node *next ;,利用指针和结构体建立链表,1222,1556,1066,结点1,结点2,结点3,结点4,1malloc函数 malloc函数的原型为: void *malloc (unsigned int size) 其作用是在内存的动态存储区(堆)中分配一个长度为size的连续空间。 2free函数 由于内存空间总是有限的,不可能无限分配下去,而且一个程序应该尽量节约系统资源,因此,用完后应及时释放它,以便其它的变量或者程序能够使用。这时我们就要用到free函数。其函数原型是: void free(void *p) 作用是释放由指针p所指向的内存空间。,静态链表,静态链表的结点不是动态开辟的,动态链表,11.7.2 链表的定义和特点,1)不需要预先分配内存空间; 2)分配的空间可以根据程序的需要扩大或缩小。,【例11-10】单链表的建立。 #include #include /*包含动态内存分配函数的头文件*/ #define N 10 /*N为人数*/ typedef struct node char name20; struct node *link; stud;,stud * create(int n) /*建立单链表的函数,形参n为人数*/ stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/ int i; /*计数器*/ if(h=(stud *)malloc(sizeof(stud)=NULL) /*分配空间并检测*/ printf(“分配内存空间失败!“); exit(0); h-name0=; /*把表头结点的数据域置空*/ h-link=NULL; /*把表头结点的链域置空*/ p=h; /*p指向表头结点*/,for(i=0;ilink=s; /*把s的地址赋给p所指向的结点的链域, 这样就把p和s所指向的结点连接起来了*/ printf(“请输入第%d个人的姓名“,i+1); scanf(“%s“,s-name); /*在当前结点s的数据域中保存姓名*/ s-link=NULL; p=s; return(h); ,void main() int number; /*保存人数*/ stud *head; /*head是保存单链表表头结点地址的指针*/ number=N; head=create(number); /*把新建单链表表头地址赋给head指针*/ ,以上为建立包含N个人姓名的单链表。建好一个单链表之后,可进行一些如插入、删除等操作。 下面先介绍查找算法,再来讨论插入和删除操作,,stud * search(stud *h,char *x) /*查链表函数,其中h是链表头指针,x指针是要查找人的姓名*/ stud *p; /*当前指针,指向要与所查找的姓名进行比较的结点*/ char *y; /*保存结点数据域内姓名的指针*/ p=h-link; while(p!=NULL) y=p-name; if(strcmp(y,x)=0) /*把数据域里的姓名与所要查找的姓名 比较,若相同则返回0,即条件成立*/ return(p); /*返回与所要查找结点的地址*/ else p=p-link; if(p=NULL) printf(“未能查找到该数据!“); ,动态链表的插入操作,假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),现在需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的指针域存储s的地址,s的指针域存储q的地址即可。(p-link=s;s-link=q),这样就完成了插入操作。,void insert(stud *p) /*插入函数,在指针p后插入*/ char stuname20; stud *s; /*指针s是保存新结点地址的*/ if(s= (stud *) malloc(sizeof(stud)=NULL) printf(“不能分配内存空间!“); exit(0); printf(“请输入你要插入的人的姓名:“); scanf(“%s“,stuname); strcpy(s-name,stuname); /*把指针stuname所指向的数组元素 拷贝给新结点的数据域*/ s-link=p-link; /*把新结点的链域指向原来p结点的后继结点*/ p-link=s; /*p结点的链域指向新结点*/ ,动态链表的删除操作,假如我们已经知道了要删除的结点p的位置,那么要删除p结点时只要令p结点的前驱结点的指针域由存储p结点的地址改为存储p的后继结点的地址,并释放p结点即可。,void delete(stud *x,stud *y) /*删除函数,其中y为要删除的结点的指针,x为要删除的结点 的前一个结点的指针*/ stud *s; s=y; x-link=y-link; free(s); ,11.8 共同体 用户自定义数据类型,也叫联合体 用途: 将不同类型的数据项组织为一个整体,占有同一段内存 共用体类型定义 定义形式:,union 共同体名 成员表; ;,例 union number int i; float f; ;,共用体变量的定义,1)先定义共同体类型,再定义及共同体类型变量 union number int i; float f; ; union number data;,共用体变量的定义,2)定义类型的同时,定义共同体类型变量 union number int i; float f; data;,共用体变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艺术创作与审美体验知识考点
- 五年级英语动词时态的运用教案
- 商业品牌策划推广合作协议
- 电子健康档案共享服务协议
- 填埋场场地复垦与生态恢复路径
- 建筑结构基础知识点梳理
- 环境科学空气质量检测试题汇编
- 河边的美景写景作文(6篇)
- 真实情境问题创设对学科核心素养发展的影响
- 新员工培训流程管理表格化表
- 北疆文化课件
- 肝脓肿护理查房课件
- 灭火器培训试题及答案
- 种植牙协议合同书模板
- 2025春冀美版(2024)小学美术一年级下册(全册)教学设计及反思附目录P208
- (江苏小升初)近两年真题分类汇编专题13 解答题57题(一)-江苏省2024年小升初数学招生分班备考专版(答案解析)
- DB41-T 2643-2024 农田地膜残留调查监测技术规程
- 2025年沪教版六年级语文下学期期末综合复习同步练习题单
- 我命由我不由天课件-2025年高三百日励志班会课
- PADI潜水OW理论知识课件
- “共享平台广告获利”平台广告获利共享商业计划书
评论
0/150
提交评论