收藏 分享(赏)

第9章+结构体数据类型与链表.ppt

上传人:11xg27ws 文档编号:4725293 上传时间:2019-01-09 格式:PPT 页数:47 大小:661.50KB
下载 相关 举报
第9章+结构体数据类型与链表.ppt_第1页
第1页 / 共47页
第9章+结构体数据类型与链表.ppt_第2页
第2页 / 共47页
第9章+结构体数据类型与链表.ppt_第3页
第3页 / 共47页
第9章+结构体数据类型与链表.ppt_第4页
第4页 / 共47页
第9章+结构体数据类型与链表.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、第九章 结构体与链表,北京邮电大学出版社,内容提要,结构体类型的定义 结构体类型变量 结构体类型数组 结构体类型指针 结构体与函数 链表,结构体概述(1),结构体 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型 结构体类型定义,struct 结构体名 类型标识符 成员名1;类型标识符 成员名2;. ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,结构体概述(2),定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩:,struct student int no

2、; /*学号*/char name10; /*姓名*/char sex; /*性别*/int age; /*年龄*/float score; /*C成绩*/ ;注:;不能省,结构体类型定义描述结构 的组织形式,不分配内存,如考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:,struct student int no; /*学号*/char name10; /*姓名*/char sex; /*性别*/int age; /*年龄*/float score10; /*10门课程成绩*/float tcj, acj; /*总成绩, 平均成绩*/ ;,定义结构体类型,描述下列数据 (2)个人数

3、据: 包含姓名、性别、年龄、身高、体重、住址:,struct person char name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float height; /*身高*/ float weight; /*体重*/ char addr50; /*住址*/ ;,(3)日期结构体类型包括年、月、日: struct date int year; /*年*/ month; /*月*/ day; /*日*/ ;,(4)如职工信息结构体类型: struct person char name20; /*姓名*/ char address40; /*地址*/

4、float salary; /*工资*/ float cost; /*扣款*/ struct date hiredate; /*聘任日期*/ ;,结构体类型可以嵌套定义即一个结构体类型中的某些成员又是其他结构体类型,结构体类型变量的定义(1),先定义结构体类型,再定义结构体变量 一般形式:,例 struct student int num;char name20;char sex;int age;float score;char addr30; struct student stu1,stu2;,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 变

5、量名表列;,例 #define STUDENT struct studentSTUDENT int num;char name20;char sex;int age;float score;char addr30; STUDENT stu1,stu2;,结构体类型变量的定义(2),定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,结构体类型

6、变量的定义(3),直接定义结构体变量 一般形式:,struct 类型标识符 成员名;类型标识符 成员名;. 变量名表列;,例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义 变量只能一次,结构体类型声明的说明,说明 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期,结构体变量的使用(1),由结构体变量名引用其成员

7、结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,引用方式: 结构体变量名.成员名,成员(分量)运算符 优先级: 1 结合性:从左向右,结构体变量的初始化(1),形式一:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road

8、”;,结构体变量的初始化(2),形式二:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,结构体变量的初始化(3),形式三:,struct 类型标识符 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1

9、=112,“Wang Lin”,M,19, “200 Beijing Road”;,结构体变量存储分配示意图,例 9.1 求某同学上学期8门课程的总成绩与平均成绩。,程序如下: main( ) int i; struct stchar xm8; float cj9; float tcj, acj; stu;,scanf(%s, stu.xm); /*输入*/ for(i=1; i=8;i+)scan(%f, i+)stu.tcj+=stu.cji; stu.acj=stu.tcji/8; /*求平均成绩*/ printf(%s总成绩=%6.2f, 平均成绩=%6.2f,stu.tcj,stu.

10、acj); ,输入数据: CHEN 80 86 79 98 88 72 96 66 运行结果: CHEN的总成绩=577.00, 平均成绩= 72.13,结构体类型数组,结构体数组的定义 三种形式:,形式一: struct student int num;char name20;char sex;int age; struct student stu2;,形式二:struct student int num;char name20;char sex;int age;stu2;,形式三:struct int num;char name20;char sex;int age;stu2;,结构体数组

11、初始化与引用,结构体数组初始化,例 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 =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,例 统

12、计候选人选票,struct person char name20;int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20;for(i=1;i=10;i+) scanf(“%s“,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(“%5s:%dn“,leaderi.name,leaderi.count); ,指向结构体变量的指针,指向结构体变

13、量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符 优先级: 1 结合方向:从左向右,例 指向结构体的指针变量,main() struct student long int num;char name20;char sex;float score;stu_1,*p;p= ,例 int n;int *p= n=10,struct student stu1; struct student *p= (*p).num=101,总结:结构体成员变量引用方式,结构体变量.成员名

14、(*p).成员名 p-成员名 其中,-称为指向运算符 请分析下列几种运算: p-n p-n+ +p-n,指向结构体数组元素的指针,例 指向结构体数组的指针,struct student int num;char name20;char sex;int age; stu3=10101,“Li Lin“,M,18,10102,“Zhang Fun“,M,19,10104,“Wang Min“,F,20; main() struct student *p;for(p=stu;pnum,p-name,p-sex,p-age); ,结构体变量作为函数参数,用结构体变量的成员作参数-值传递 用指向结构体变

15、量或数组的指针作参数-地址传递 用结构体变量作参数-多值传递,效率低,struct data int a, b, c; ; main() void func(struct data);struct data arg;arg.a=27; arg.b=3; arg.c=arg.a+arg.b;printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c);printf(“Call Func()n“);func(arg);printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); void func

16、(struct data parm) printf(“parm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c);printf(“Process.n“);parm.a=18; parm.b=5; parm.c=parm.a*parm.b;printf(“parm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c);printf(“Return.n“); ,例 用结构体变量作函数参数,struct data int a, b, c; ; main() void func(struct data *par

17、m);struct data arg;arg.a=27; arg.b=3; arg.c=arg.a+arg.b;printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c);printf(“Call Func()n“);func( ,例 用结构体指针变量作函数参数,结构体变量作为函数参数,总结 注意:ANSI C允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同 把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,开销大,因此一般不采用 在函数中要结构体中成员变量的值,需要传结构体指针

18、变量或结构体地址,函数的返回值为结构体类型,struct student input() /*输入一个学生的数据*/int i;struct student stud;scanf(%ld,/*返回结构体数据*/ ,函数的返回值可以是结构体类型。例如,定义了结构体数组: struct student stud100; 数据输入可由如下形式的语句实现: for(i=0;i100; i+)studi=input(); 函数input()的功能是输入一个结构体数据,并将输入结构体数据作为返回值,返回给第i个学生记录,实现第i个学生的数据输入,链表概述(1),所谓链表是指若干个数据项(每个数据项称为一个

19、“结点”)按一定的原则连接起来。每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表。,链表概述(2),struct student long num;float score;sturct student *next; struct student *head;,一个简单链表示例:,内存动态管理函数,动态分配存储 根据需要开辟或释放存储单元 相关函数 malloc函数 calloc函数 free函数 说明 应包含malloc.h或stdlib.h,malloc函数,函数原型 typedef unsigned size_t; void *malloc

20、(size_t size); 参数 size:分配存储空间的字节数 返回值 若成功,返回指向分配区域起始地址的指针 若失败,返回NULL,calloc函数,函数原型 void *calloc(size_t n,size_t size); 参数 n :分配内存的项目数 size:分配内存的每个项目的字节数 返回值 若成功,返回指向分配区域起始地址的指针 若失败,返回NULL,free函数,函数原型 void free(void *ptr); 参数 ptr:要释放的内存区地址 说明 释放prt指向的内存区 释放后的内存区能够分配给其他变量使用,realloc函数,函数原型 void *reallo

21、c(void *ptr,unsigned int size) 参数 ptr:需要改变存储空间的内存区地址 size:将ptr所指的存储区的大小改为size个大小 说明 用来使已分配的空间ptr改变大小,即重新分配,链表的基本操作,链表的建立 从链尾到链头:新结点插入到链头 从链头到链尾:新结点插入到链尾 链表的插入操作 根据一定的条件,把新结点插入到指定位置 链表的删除操作 根据一定的条件,删除一个或多个结点 链表的输出操作 链表的查找操作,建立链表操作(从链尾到链头),head,., head = p;, p = malloc(sizeof (struct node); p-data = a

22、i;, for(i=0; in; i+), p-next = head;,建立链表操作 (从链头到链尾),., p-next = q;, q = malloc(sizeof (struct node); q-data = ai;, for(i=0; in; i+), q-next = NULL;, p = q;,链表的插入操作,.,., p-next = q;, q = malloc(sizeof (struct node); q-data = x;, if(p满足插入条件), q-next = p-next;,链表的删除操作,.,., p-next = q-next;, free(q);, q = p-next;, if(p-next满足删除条件),链表的输出操作,.,., p = p-next;, while(p), printf(“%d“, p-data);,链表的查找操作,.,., p2=p1;p1=p1-nxet ;, while(num!=p1-num & p1!=NULL ), printf (find: %ld %5.2fn,num,p1-score);,本章结束,再见!,同学们:,copy,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报