C语言程序设计PPT第8章结构体程序设计.ppt
C语言程序设计(第3版)张磊编著,2012年10月清华大学出版社出版。该教材面向程序设计初学者编写,适合将C语言作为第一门程序设计语言的高校学生。该教材理论教学和实验教学合二为一,在每章之后均设有实验指导。实验指导分为基础实验和综合实验两部分。基础实验紧密结合教材中的例题程序设置,以“理解验证完善扩充提高”为实验教学线索,重在巩固课堂教学知识,提高调试程序及完善程序的能力;综合实验以算法设计和程序实现为重点,训练运用所学知识解决实际问题的能力。该教材同时配有程序资源和试题库。C C语言程序设计语言程序设计(第第3 3版版)课件课件语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社C C语言程序设计语言程序设计第第8 8章章 结构体程序设计结构体程序设计 C语言程序设计(第语言程序设计(第3版)版)张张 磊磊 编著编著 21世纪高等学校规划教材世纪高等学校规划教材 清华大学出版社清华大学出版社语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社第第8 8章章 结构体程序设计结构体程序设计u8.1 结构体数据概述 u8.2 结构体类型和结构体变量u8.3 结构体数组 u8.4 结构体指针变量u8.5 使用动态链表存储数据u8.6 链表的基本操作u8.7 结构体应用举例语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.1 8.1 结构体数据概述结构体数据概述结构体数据概述结构体数据概述结构体数据是由多个数据项组合而成的数据,如表8-1所示的学生信息表,当把每一行视为一个完整数据时,该数据就是一个结构体数据。为了有效地处理这样一类组合数据,C语言提供了“结构体”技术,它可以把多个数据项组合起来,作为一个数据整体进行处理。学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.1 8.1 结构体数据概述结构体数据概述结构体数据概述结构体数据概述语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2 8.2 结构体类型和结构体变量结构体类型和结构体变量结构体类型和结构体变量结构体类型和结构体变量u8.2.1 使用结构体变量存储学生信息 u8.2.2 定义结构体数据类型 u8.2.3 结构体变量的定义及使用语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.18.2.1使用结构体变量存储学生信息使用结构体变量存储学生信息使用结构体变量存储学生信息使用结构体变量存储学生信息例例例例8-1 利用结构体变量存储表8-1中第1行的学生信息,并输出其姓名和成绩。#includestruct student struct student /*/*定义结构体数据类型定义结构体数据类型定义结构体数据类型定义结构体数据类型*/*/int num;int num;char name20;char name20;char sex;char sex;int score;int score;void main()struct student stu=9011,liujia,M,87;struct student stu=9011,liujia,M,87;printf(Name:%sn,stu.name);printf(Score:%dn,stu.score);语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.2 8.2.2 定义结构体数据类型定义结构体数据类型定义结构体数据类型定义结构体数据类型l定义结构体类型的一般格式struct struct 结构体名结构体名结构体名结构体名 成员表成员表成员表成员表;说明:“结构体名”是用户定义的结构体的名字,在以后定义结构体变量时,使用该名字进行类型标识。“成员表”是对结构体数据中每一个数据项的变量说明,其格式与说明一个变量的一般格式相同:数据类型名数据类型名数据类型名数据类型名 成员名成员名成员名成员名;“struct”是关键字,“struct struct 结构体名结构体名结构体名结构体名”是结构体类型标识符,在类型定义和类型使用时“struct”都不能省略。结构体名称可以省略,此时定义的结构体称为无名结构体。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社9.1.2结构体类型定义结构体类型定义l学生组合数据的结构体类型定义:学生组合数据的结构体类型定义:struct studentint num;char name20;char sex;int score;学号学号姓名姓名性别性别成绩成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.3结构体变量的定义及使用结构体变量的定义及使用1.1.定义结构体变量定义结构体变量定义结构体变量定义结构体变量 先定义结构体类型,再定义结构体变量。l一般格式struct struct 结构体类型名称结构体类型名称结构体类型名称结构体类型名称 结构体变量名;结构体变量名;结构体变量名;结构体变量名;如:struct studentstruct student student1,student2;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.3结构体变量的定义及使用结构体变量的定义及使用 在定义结构体类型的同时定义结构体变量。l一般格式struct struct 结构体名结构体名结构体名结构体名 成员表成员表成员表成员表 结构体变量结构体变量结构体变量结构体变量1,1,结构体变量结构体变量结构体变量结构体变量2 2,结构体变量,结构体变量,结构体变量,结构体变量n;n;例如:struct student int num;char name20;char sex;int score;student1,student2;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.3 8.2.3 结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用 不定义结构体类型名,直接定义结构体类型变量。l一般格式structstruct 成员表成员表成员表成员表;结构体变量结构体变量结构体变量结构体变量1,1,结构体变量结构体变量结构体变量结构体变量2,2,结构体变量结构体变量结构体变量结构体变量n n;例如:struct int num;char name20;char sex;int score;student1,student2;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.3 8.2.3 结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用2.2.引用结构体成员引用结构体成员引用结构体成员引用结构体成员l引用结构体成员的一般格式结构体变量名结构体变量名结构体变量名结构体变量名.成员名称成员名称成员名称成员名称例如:student1.age例例例例8-28-2 输入两个学生的信息,然后输出学习成绩高的学生的姓名和成绩信息。若成绩相同时,只输出第1个学生的信息。#includestruct studentstruct student int num;int num;char name20;char name20;char sex;char sex;int score;int score;stu1,stu2;stu1,stu2;void main()printf(Data1:);scanf(%d%s%c%d,&stu1.num,stu1.name,&stu1.sex,&stu1.score);printf(Data2:);scanf(%d%s%c%d,&stu2.num,stu2.name,&stu2.sex,&stu2.score);if(stu1.score=stu2.score)printf(%s,%dn,stu1.name,stu1.score);elseprintf(%s,%dn,stu2.name,stu2.score);语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.2.3 8.2.3 结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用结构体变量的定义及使用3.3.3.3.结构体变量的初始化结构体变量的初始化结构体变量的初始化结构体变量的初始化:定义结构体变量时对其成员赋初值。:定义结构体变量时对其成员赋初值。n n初始化的一般形式初始化的一般形式structstruct 结构体名结构体名 结构体变量结构体变量=初始化数据初始化数据;例如:例如:例如:例如:说明:说明:说明:说明:“”“”“”“”中的初始化数中的初始化数中的初始化数中的初始化数据用逗号据用逗号据用逗号据用逗号“,”“,”“,”“,”分隔。分隔。分隔。分隔。初始化数据的个数与结初始化数据的个数与结初始化数据的个数与结初始化数据的个数与结构体成员的个数应相同,构体成员的个数应相同,构体成员的个数应相同,构体成员的个数应相同,它们是按成员的先后顺序它们是按成员的先后顺序它们是按成员的先后顺序它们是按成员的先后顺序一一对应赋值的。一一对应赋值的。一一对应赋值的。一一对应赋值的。每个初始化数据必须符每个初始化数据必须符每个初始化数据必须符每个初始化数据必须符合与其对应的成员的数据合与其对应的成员的数据合与其对应的成员的数据合与其对应的成员的数据类型。类型。类型。类型。struct studentstruct student int num;int num;char name20;char name20;char sex;char sex;int score;int score;stu=9901,liujia,M,87;stu=9901,liujia,M,87;成成成成员员员员初始化数据初始化数据初始化数据初始化数据数据数据数据数据类类类类型型型型stu.num9901intstu.nameliujiacharstu.sexMcharstu.score87int语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.3 8.3 结构体数组结构体数组结构体数组结构体数组l8.3.1 结构体数组概述l8.3.2 结构体数组的初始化l8.3.3 利用结构体数组管理学生信息语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.3.1 8.3.1 结构体数组概述结构体数组概述结构体数组概述结构体数组概述数组元素是结构体类型的数组,称为结构体数组。l定义方法与其他结构体变量的定义方法相同。先定义结构体类型,然后用结构体类型定义数组变量。例如:struct student information100;定义结构体类型的同时,定义数组变量。定义无类型名的结构体数组变量。例如:structstruct intint year;year;intint month;month;intint day;day;date110,date210;date110,date210;l引用结构体数组成员的一般格式结构体数组名下标.成员名information20.score=91;例如:struct struct student int year;int year;int month;int month;int day;int day;date110,date210;date110,date210;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.3.28.3.2结构体数组的初始化结构体数组的初始化结构体数组的初始化结构体数组的初始化 l结构体数组的初始化例如:struct student info3=9901,liujia,M,87,9902,wangkai,M,89,9903,xiaohua,F,81;数组元素数组元素成员成员numnum成员成员namename成员成员sexsex成员成员scorescoreinfo0info099019901liujialiujiaM M8787info1info199029902wangkaiwangkaiM M8989info2info299039903xiaohuaxiaohuaF F8181语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.3.3 8.3.3 利用结构体数组管理学生信息利用结构体数组管理学生信息利用结构体数组管理学生信息利用结构体数组管理学生信息例例例例8-38-3 按照表8-1的数据,输入一个班级的学生信息,并进行如下处理:把学习成绩在85以上的学生找出来,并输出这部分学生的姓名和成绩。分别统计男生和女生人数。l分析 定义一个结构体类型,并用它定义一个存储学生信息的结构体数组;向结构体数组中输入学生数据;统计,并输出结果。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.3.3 8.3.3 利用结构体数组管理学生信息利用结构体数组管理学生信息利用结构体数组管理学生信息利用结构体数组管理学生信息/*program e8-3.c*/#include#define N 5 struct studentint num;char name20;char sex;int score;void main()struct student stuN;int i,count_m=0,count_f=0;printf(Input Data:n);for(i=0;iN;i+)scanf(%d%s%c%d,&stui.num,stui.name,&stui.sex,&stui.score);printf(Result:n);for(i=0;i85)printf(%s,%dn,stui.name,stui.score);if(stui.sex=M|stui.sex=m)count_m+;else count_f+;printf(Boys=%d,Girls=%dn,count_m,count_f);语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.4 8.4 结构体指针变量结构体指针变量结构体指针变量结构体指针变量l指向结构体变量的指针变量,简称为结构体指针变量。与其他类型的指针一样,结构体指针变量既可以指向单一的结构体变量,也可以指向结构体数组变量,结构体指针还可以作函数的参数。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.4 8.4 结构体指针变量结构体指针变量结构体指针变量结构体指针变量l8.4.1 结构体指针变量的定义及使用l8.4.2 结构体指针作函数的参数语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.4.1 8.4.1 结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用l定义结构体指针变量的一般形式:struct 结构体名*结构体指针变量名;例如:struct student*p,*q;struct student stud1,info10;p=&stud1;q=info;p stud1变量变量变量变量q info数组数组数组数组n成员引用std1.num与p-num等价info1.num与q1-num等价语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.4.1 8.4.1 结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用void main()struct student stu,*p;p=&stu;p-num=9911;strcpy(p-name,changjiang);p-sex=F;p-score=91;printf(Num:%dnName:%sn,p-num,p-name);printf(Sex:%cnScore:%dn,p-sex,p-score);例例例例8-48-4 结构体指针用法示例。结构体指针用法示例。/*program e8-4.c*/#include#includestruct student int num;char name20;char sex;int score;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.4.1 8.4.1 结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用结构体指针变量的定义及使用例例例例8-58-5指向结构体数组的指针应用示例。指向结构体数组的指针应用示例。指向结构体数组的指针应用示例。指向结构体数组的指针应用示例。/*program e9-4.c*/#include#includestruct student int num;char name20;char sex;int score;stu3=9913,xiaoli,F,81,9914,zhanghua,M,82,9915,wangjun,F,88;void main()struct student*p;for(p=stu;pstu+3;p+)for(p=stu;pnum,p-name,p-sex,p-scorep-num,p-name,p-sex,p-score););共共共共3 3组初始化数据组初始化数据组初始化数据组初始化数据结构体指针结构体指针结构体指针结构体指针语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社void main()void main()void output(struct sudent*,int);void output(struct sudent*,int);output(stu,N);output(stu,N);void output(struct student*p,int n)void output(struct student*p,int n)int i;int i;for(i=0;in;i+,p+)for(i=0;inum,p-name,p-sex,p-score);p-num,p-name,p-sex,p-score);return;return;/*program e8-6.c*/#include#include#define N 3struct student int num;char name20;char sex;int score;stuN=9913,xiaoli,F,81,9914,zhanghua,M,82,9915,wangjun,F,88;结构体结构体结构体结构体指针指针指针指针8.4.2 8.4.2 结构体指针作函数的参数结构体指针作函数的参数结构体指针作函数的参数结构体指针作函数的参数例例例例8-68-68-68-6 结构体指针作函数参数示例。结构体指针作函数参数示例。结构体指针作函数参数示例。结构体指针作函数参数示例。结构体结构体结构体结构体数组名数组名数组名数组名语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5 8.5 链表概述链表概述链表概述链表概述l8.5.1 链表的概念l8.5.2 链表的特点l8.5.3 动态内存管理函数l8.5.4 定义链表结构语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.1 8.5.1 链表的概念链表的概念链表的概念链表的概念l l链表链表链表链表是结构体最重要的应用,它是一种非固定长度的数据结构,是一种动态存储技术,它能够根据数据的结构特点和数量使用内存,尤其适用于数据个数可变的数据存储。l使用链表存储表中前3个学生数据。学号姓名性别成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88 用calloc()申请一段内存M,并把它分成两部分:一部分存储数据;另一部分存储下一个内存段的地址。将一个学生数据存储在M的数据区中。若当前是第一个数据,则将M的首地址保存在指针变量head中;否则将M的首地保存在上一个内存段中。重复、的过程,直到所有数据存储完毕,在最后一段内存的地址区存储结束标志。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.2 8.5.2 链表的特点链表的特点链表的特点链表的特点 链表中的结点具有完全相同的结构,每一个结点存储一个独立的结构体数据;链表的结点由系统随机分配,它们在内存中的位置可能是相邻的,也可能是不相邻的,结点之间的联系是通过指针域实现的;为了能准确的定位第一个结点,每个链表要有一个表头指针,从第一个结点开始,沿指针链能遍历链表中的所有结点;链表中的结点是在需要时用calloc()申请的,当不再需要时,应有free()函数释放所占用的内存段。一个链表不需要事先说明它要包括的结点数目,在需要存储新的数据时,就可增加结点,需要删除数据时,就减少结点,链表结点是动态变化的。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.3 8.5.3 动态内存管理函数动态内存管理函数动态内存管理函数动态内存管理函数l l动态分配内存动态分配内存动态分配内存动态分配内存按需分配内存,运行时需要多大的空间就分配多大的空按需分配内存,运行时需要多大的空间就分配多大的空按需分配内存,运行时需要多大的空间就分配多大的空按需分配内存,运行时需要多大的空间就分配多大的空间间间间l lC C语言通过动态内存管理函数,实现动态内存管理。链语言通过动态内存管理函数,实现动态内存管理。链语言通过动态内存管理函数,实现动态内存管理。链语言通过动态内存管理函数,实现动态内存管理。链表每一个结点的建立和删除过程,都需要使用动态内存表每一个结点的建立和删除过程,都需要使用动态内存表每一个结点的建立和删除过程,都需要使用动态内存表每一个结点的建立和删除过程,都需要使用动态内存管理函数。管理函数。管理函数。管理函数。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.3 8.5.3 动态内存管理函数动态内存管理函数动态内存管理函数动态内存管理函数1 1malloc()malloc()函数函数函数函数n n函数原型函数原型函数原型函数原型void*void*malloc(unsignedmalloc(unsigned intint size);size);n n功能功能功能功能分配一块长度为分配一块长度为分配一块长度为分配一块长度为sizesize字节的连续空间,并将该空间的首地址作为函数字节的连续空间,并将该空间的首地址作为函数字节的连续空间,并将该空间的首地址作为函数字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功执行,返回值为空指针(的返回值。如果函数没有成功执行,返回值为空指针(的返回值。如果函数没有成功执行,返回值为空指针(的返回值。如果函数没有成功执行,返回值为空指针(NULLNULL或或或或0 0)。)。)。)。由于返回的指针的基类型为由于返回的指针的基类型为由于返回的指针的基类型为由于返回的指针的基类型为voidvoid,应该通过显式类型转换后才能存入,应该通过显式类型转换后才能存入,应该通过显式类型转换后才能存入,应该通过显式类型转换后才能存入其他基类型的指针变量中,否则会有警告提示。其他基类型的指针变量中,否则会有警告提示。其他基类型的指针变量中,否则会有警告提示。其他基类型的指针变量中,否则会有警告提示。例如:例如:例如:例如:intint*p;*p;p=(p=(intint*)*)malloc(sizeof(intmalloc(sizeof(int););语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.3 8.5.3 动态内存管理函数动态内存管理函数动态内存管理函数动态内存管理函数2 2free()free()函数函数函数函数n n函数原型函数原型函数原型函数原型void void free(voidfree(void*block);*block);n n功能功能功能功能释放以前分配给指针变量释放以前分配给指针变量释放以前分配给指针变量释放以前分配给指针变量blockblock的动态空间,但指针变量的动态空间,但指针变量的动态空间,但指针变量的动态空间,但指针变量blockblock不会自不会自不会自不会自动变成空指针。动变成空指针。动变成空指针。动变成空指针。3.3.calloccalloc()()函数函数函数函数n n函数原型函数原型函数原型函数原型void*void*calloc(unsignedcalloc(unsigned n,unsignedn,unsigned size);size);n n功能功能功能功能以以以以sizesize为单位大小共分配为单位大小共分配为单位大小共分配为单位大小共分配n*sizen*size个字节的连续空间,并将该空间的首个字节的连续空间,并将该空间的首个字节的连续空间,并将该空间的首个字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功执行,返回值为空指针地址作为函数的返回值。如果函数没有成功执行,返回值为空指针地址作为函数的返回值。如果函数没有成功执行,返回值为空指针地址作为函数的返回值。如果函数没有成功执行,返回值为空指针(NULL(NULL或或或或0)0)。例如:例如:例如:例如:intint*p;*p;p=(p=(intint*)calloc(10,sizeof(int);*)calloc(10,sizeof(int);语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.4 8.5.4 定义链表结构定义链表结构定义链表结构定义链表结构l要定义一个链表结点的结构,需要包括两个方面:定义数据存储所对应的各个成员;定义指向其他结点的指针成员。例如:假若要用链表逐个存储一批整数,其结点结构可定义如下:struct node int data;struct node*next;存储具体存储具体数据数据存储下一个节存储下一个节点的地址点的地址ustruct node类型的结点形成的链表类型的结点形成的链表 头指针头指针空指针空指针语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.5.4 8.5.4 定义链表结构定义链表结构定义链表结构定义链表结构学号学号姓名姓名性别性别成绩成绩9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88struct studentint num;char name20;char sex;int score;struct student*next;必须的成员,否必须的成员,否则构不成链表则构不成链表n n学生链表的结点定义学生链表的结点定义学生链表的结点定义学生链表的结点定义n n结点结点结点结点语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6 8.6 链表的基本操作链表的基本操作链表的基本操作链表的基本操作l8.6.1 链表结点的插入l8.6.2 链表结点的删除l8.6.3 链表结点的查找语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6.1 链表结点的插入链表结点的插入l在链表中插入结点,就是把一个新结点连接到链表中。l两种情况:在空链表中插入一个结点;在链表的p结点之后插入一个新结点。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6.1 8.6.1 链表结点的插入链表结点的插入链表结点的插入链表结点的插入1在空链表中插入一个结点在空链表中插入一个结点空链表就是头指针head为空的链表。申请一个new结点。new=(struct node*)calloc(1,sizeof(struct node);为p结点填充数据。将要存储的数据对应赋值给p结点数据域的各个成员。修改有关指针的指向。将new的next成员置空,使new结点成为链表的最后一个结点。将head指向new结点。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6.1 8.6.1 链表结点的插入链表结点的插入链表结点的插入链表结点的插入2 2在在在在headhead链表的链表的链表的链表的p p结点之后插入一个结点结点之后插入一个结点结点之后插入一个结点结点之后插入一个结点head链表和要插入结点new如图所示。要将new结点插入在p结点之后,就是将new结点变成结点C的下一个结点,而使new的下一个结点成为结点D。使new的指针域存储结点D的首地址。new-next=p-next;把new的首地址存储到结点p的指针域中。p-next=new;语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6.1 8.6.1 链表结点的插入链表结点的插入链表结点的插入链表结点的插入linsert()函数 功能:在head链表的p结点之后插入值为x的结点struct student*insert(struct node*head,struct node*p,int x)struct node*new;new=(struct node*)calloc(1,sizeof(struct node);new-data=x;if(head=NULL)head=new;head-next=NULL;else new-next=p-next;p-next=new;return(head);语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大学出版社清华大学出版社清华大学出版社清华大学出版社8.6.1 8.6.1 链表结点的插入链表结点的插入链表结点的插入链表结点的插入例例例例8-88-8 用插入结点的方法建立图示的学生成绩链表,链表head有10个结点,每个结点存储一个学生的学号和学习成绩数据。程序程序:e8-8.cl函数的功能creat_node()函数:生成一个链表结点。creat_list()函数:生成有n个struct s_node型结点的链表,函数的返回值是链表的头指针。out_list()函数:用于输出head链表的各结点值。语言程序设计(第语言程序设计(第语言程序设计(第语言程序设计(第3 3 3 3版)张磊编著版)张磊编著版)张磊编著版)张磊编著 清华大