第8章结构体pt课件

上传人:仙*** 文档编号:48463107 上传时间:2022-01-07 格式:PPT 页数:38 大小:175KB
收藏 版权申诉 举报 下载
第8章结构体pt课件_第1页
第1页 / 共38页
第8章结构体pt课件_第2页
第2页 / 共38页
第8章结构体pt课件_第3页
第3页 / 共38页
资源描述:

《第8章结构体pt课件》由会员分享,可在线阅读,更多相关《第8章结构体pt课件(38页珍藏版)》请在装配图网上搜索。

1、白 雪 飞中国科学技术大学电子科学与技术系Dept. of Elec. Sci. & Tech., USTCFall, 2003第第8章章 结结 构构 体体目 录l结构体l结构体数组l指向结构体的指针l定义类型别名l动态存储分配函数l结构体的应用链表结构体 (Structure)l结构体概述l结构体类型的声明l结构体变量的定义l结构体变量的初始化l结构体变量的引用结构体概述l结构体n将不同类型的数据组合成一个整体n用来表示简单类型无法描述的复杂对象n可以用结构体来定义用户自己的数据结构l举例n描述学生信息num12039nameBill GatessexMage40score76.5addrN

2、ew York结构体类型的声明l一般形式nstruct 结构体名 成员表列 ;n“成员表列”形式 类型 成员名; 类型 成员名; . .结构体类型声明的说明 (1)l声明了一种类型,而不是定义变量l结构体名可以没有,但是这样就无法再次使用该结构体类型了l成员表列中是成员(Member)的定义l成员的定义形式与变量定义相同l成员类型可以是另一结构体类型,但不可直接或间接递归嵌套l成员表列不可为空,至少要有一个成员结构体类型声明的说明 (2)l注意不表示复合语句,其后有分号l同一结构体的成员不能重名l不同结构体的成员可以重名l结构体成员和其他变量可以重名l结构体类型与其成员或其他变量可重名nstr

3、uct test int test; test;l结构体类型名称是struct 结构体名,注意struct关键字不能省略结构体类型声明的说明 (3)l即使两个结构体声明中的成员类型、名称、顺序都完全一致,它们也是不同的类型l结构体类型也要“先声明,后使用”l如果结构体类型声明在函数内部,则该函数之外无法引用此结构体类型l一般把结构体类型声明放到文件最前面l也可以把结构体类型声明放在头文件里结构体类型的声明举例struct student unsigned num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ unsigned age; /

4、* 年龄 */ float score; /* 分数 */ char addr50; /* 地址 */;结构体变量的定义 (1)l先声明结构体类型再定义变量struct student unsigned num; char name20; char sex; unsigned age; float score; char addr50;struct student stu1, stu2;结构体变量的定义 (2)l在声明结构体类型的同时定义变量struct student unsigned num; char name20; char sex; unsigned age; float score

5、; char addr50; stu1, stu2;结构体变量的定义 (3)l直接定义无名结构类型变量struct unsigned num; char name20; char sex; unsigned age; float score; char addr50; stu1, stu2;结构体声明和变量定义举例struct date int year, month, day; ;struct student unsigned num; char name20; char sex; struct date birthday; float score; stu1, stu2;结构体变量的初始化

6、l按照成员的顺序和类型对成员初始化struct date date1 = 1984, 10, 20;struct student stu = 1001, /*unsigned num*/ Tom, /*char name20*/ M, /*char sex*/ 1983, 9, 20,/*struct date birthday*/ 93.5 /*float score*/;结构体变量中成员的引用l一般形式n结构体变量名.成员名l成员运算符 .n具有最高的优先级,自左向右结合l说明n结构体成员和同类型的变量用法相同n若成员类型又是一个结构体,则可以使用若干个成员运算符,访问最低一级的成员结构体

7、变量中成员的引用举例struct student stu;. .scanf(%f, &stu.score);stu.num = 12345;stu.birthday.month = 11;stu.score = sqrt(stu.score) * 10;strcpy(stu.name, Mike);printf(No.%d:, stu.num);结构体变量整体引用l结构体类型变量之间可以直接相互赋值n实质上是两个结构体变量相应的存储空间中的所有数据直接拷贝n包括复杂类型在内的所有结构体成员都被直接赋值,如字符串、结构体类型等l函数的实参和形参可以是结构体类型,并且遵循实参到形参的单向值传递规则

8、l为了提高程序的效率,函数的参数多使用结构体类型指针结构体变量整体引用举例struct student stu1, stu2=1002, Kate, F, 1981, 11, 4, 89.0;void print(struct student s) printf(%d,%4s,%c,%d.%02d.%02d,%4.1fn, s.num, s.name, s.sex, s.birthday.year, s.birthday.month, s.birthday.day, s.score);void main () stu1 = stu2; /* 直接赋值 */ print(stu1); /* 10

9、02,Kate,F,1981.11.04,89.0 */结构体数组l结构体数组的用法与基本类型数组类似n定义、初始化、引用等l结构体数组可用于表示二维表格l举例struct student s10;for (i=0; i10; i+) scanf(%d,%s,%c,%d,%f, &si.num, si.name, &si.sex, &si.age, &si.score);结构体数组初始化及应用举例struct student stu = 1001,Tom,M,1980,1,2,85.5, 1002,Kate,F,1981,11,4,89.0, 1003,Mike,M,1980,3,5,95.5

10、;for (i=0; i)引用指针所指向的结构体的成员l指向运算符 -n结构体指针-成员名n具有最高的优先级,自左向右结合n若struct student stu, *p=&stu;则stu.num、(*p).num、p-num等效指向结构体数组的指针l指向结构体数组的指针n与指向其他基本类型数组的指针用法类似n注意相关运算符的结合方向和优先级l举例struct student stu10, p=stu;+p-num; /* 同+(p-num); */p+-num; /* 同(p+)-num; */(+p)-num;(p+)-num;结构体指针作函数参数举例void input(struct

11、student *p) scanf(%d %s %c %d.%d.%d %f, &p-num, p-name, &p-sex, &p-birthday.year, &p-birthday.month, &p-birthday.day, &p-score);void main () struct student stu20; int i; for (i=0; i20; i+) input(stu+i);定义类型别名l一般形式ntypedef l举例ntypedef float REAL; ntypedef struct int month; int day; int year; DATE;动态存

12、储分配函数l动态分配存储n根据需要开辟或释放存储单元l相关函数nmalloc函数ncalloc函数nfree函数l说明n应包含malloc.h或stdlib.hmalloc函数l函数原型ntypedef unsigned size_t;nvoid *malloc(size_t size);l参数nsize:分配存储空间的字节数l返回值n若成功,返回指向分配区域起始地址的指针n若失败,返回NULLcalloc函数l函数原型nvoid *calloc(size_t n, size_t size);l参数nn :分配内存的项目数nsize:分配内存的每个项目的字节数l返回值n若成功,返回指向分配区域

13、起始地址的指针n若失败,返回NULLfree函数l函数原型nvoid free(void *ptr);l参数nptr:要释放的内存区地址l说明n释放prt指向的内存区n释放后的内存区能够分配给其他变量使用结构体的应用链表 (Link List)a1 a2 a3 .anheadstruct nodedata nextaistruct node int data; struct node *next; ;struct node *head;链表的操作l链表的建立n从链尾到链头:新结点插入到链头n从链头到链尾:新结点插入到链尾l链表的遍历l删除结点n根据一定的条件,删除一个或多个结点l插入结点n根据

14、一定的条件,把新结点插入到指定位置建立链表 (从链尾到链头)headai-1. head = p; p = malloc(sizeof (struct node); p-data = ai; for(i=0; inext = head;建立链表 (从链头到链尾)ai-1. p-next = q; q = malloc(sizeof (struct node); q-data = ai; for(i=0; inext = NULL;p p = q;遍历链表.ai-1aiai+1. p = p-next;p while(p) printf(%d, p-data);删除结点.ai-1aiai+1.

15、p-next = q-next; free(q); q = p-next;pq if(p-next满足删除条件满足删除条件)插入结点.aiai+1. p-next = q; q = malloc(sizeof (struct node); q-data = x; p if(p满足插入条件满足插入条件)qx q-next = p-next;链表操作中需要注意的几个问题l注意考虑几个特殊情况下的操作n链表为空表 (head=NULL)n链表只有一个结点n对链表的第一个结点进行操作n对链表的最后一个结点进行操作l最后一个结点的next指针应为NULLl可以定义一个结构体类型用于表示结点的数据部分,以便于对数据的操作结束

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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