《C语言ppt课件第9章 结构体与链表.ppt》由会员分享,可在线阅读,更多相关《C语言ppt课件第9章 结构体与链表.ppt(43页珍藏版)》请在三一办公上搜索。
1、第九章 结构体与链表,内容提要,结构体类型的定义结构体类型变量结构体类型数组结构体类型指针结构体与函数链表,结构体概述(1),结构体1.什么叫结构体:把不同类型的数据组合成一个整体的自定义数据类型, 是一种构造数据类型。2.结构体类型定义,struct 结构体名 类型标识符 成员名1; 类型标识符 成员名2; .;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,结构体概述(2),定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩:,struct studentint no; /*学号*/ char
2、 name10; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score; /*C成绩*/;注:;不能省,结构体类型定义描述结构的组织形式,不分配内存,如考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:,struct studentint no; /*学号*/ char name10; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score10; /*10门课程成绩*/ float tcj, acj; /*总成绩, 平均成绩*/;,定义结构体类型,描述下列数据 (2)个人数据: 包含姓名、
3、性别、年龄、身高、体重、住址:,struct personchar name20; /*姓名*/char sex; /*性别*/int age; /*年龄*/float height; /*身高*/float weight; /*体重*/char addr50; /*住址*/;,(3)日期结构体类型包括年、月、日:struct dateint year; /*年*/month; /*月*/day; /*日*/;,(4)如职工信息结构体类型:struct personchar name20; /*姓名*/char address40; /*地址*/float salary; /*工资*/floa
4、t 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 结构体名 变量名表列;,例 #define STUDE
5、NT struct student STUDENT 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;,结构体类型变量的定义(3
6、),直接定义结构体变量(匿名定义)一般形式:,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
9、addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,结构体变量存储分配示意图,例 9.1 求某同学上学期8门课程的总成绩与平均成绩。,程序如下:main( ) int i; struct st char 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
10、,stu.xm,stu.tcj,stu.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;
11、 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; i
12、nt age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,例 统计候选人选票,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,
13、leaderi.name,leaderi.count);,指向结构体变量的指针,指向结构体变量的指针定义形式: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 stud
14、ent *p= (*p).num=101,总结:结构体成员变量引用方式,结构体变量.成员名(*p).成员名p-成员名其中,-称为指向运算符请分析下列几种运算:p-np-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、构体变量作为函数参数,用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-多值传递,效率低,链表概述(1),所谓链表是指若干个数据项按一定的原则连接起来。每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表。每个数据项称为一个“结点”。,链表概述(2),struct student long num; float score;sturct student *next ;struct student *head;,一个简单链表示例:,链表的基本操作,链表的建立从链尾到链头:新结点插入到链头从链头到链尾:新结
16、点插入到链尾链表的插入操作根据一定的条件,把新结点插入到指定位置链表的删除操作根据一定的条件,删除一个或多个结点链表的输出操作链表的查找操作,建立链表操作(从链尾到链头),head,., head = p;, p = malloc(sizeof (struct node); p-data = ai;, 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
17、= 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 ), p
18、rintf (find: %ld %5.2fn,num,p1-score);,copy,内存动态管理函数,动态分配存储根据需要开辟或释放存储单元相关函数malloc函数calloc函数free函数说明应包含malloc.h或stdlib.h,malloc函数,函数原型typedef unsigned size_t;void *malloc(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 *realloc(void *ptr,unsigned int size)参数ptr:需要改变存储空间的内存区地址size:将ptr所指的存储区的大小改为size个大小说明用来使已分配的空间ptr改变大小,即重新分配,本章结束,再见!,同学们:,