《C语言课件第11章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《C语言课件第11章结构体与共用体.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第11章结构体与共用体n n1、结构体类型的定义n n2、结构体变量的定义及引用n n3、结构体数组n n4、结构体类型的指针n n5、链表的基本操作n n6、共用体和枚举类型(了解)结构体类型的引入结构体类型的引入n n问题:为了描述一个事物的不同属性,需要用到各种问题:为了描述一个事物的不同属性,需要用到各种不同类不同类型的数据型的数据,这些,这些数据彼此相关数据彼此相关,形成一个有机的整体。例如:,形成一个有机的整体。例如:一个教师的基本信息由姓名、性别、年龄、职称、工资等几一个教师的基本信息由姓名、性别、年龄、职称、工资等几项组合而成。如何描述一个教师的情况呢?项组合而成。如何描述一个
2、教师的情况呢?n n前面我们已学习过各种基本类型的变量和数组,而且我们知前面我们已学习过各种基本类型的变量和数组,而且我们知道,各个变量之间是相互独立的,无任何联系;而数组只能道,各个变量之间是相互独立的,无任何联系;而数组只能用来表示一批相同类型的数据。因此,若用单个变量分别表用来表示一批相同类型的数据。因此,若用单个变量分别表示教师的姓名、性别、年龄等属性,则难以反映他们之间的示教师的姓名、性别、年龄等属性,则难以反映他们之间的内在联系;若用数组,则根本无法表示,因为姓名、性别、内在联系;若用数组,则根本无法表示,因为姓名、性别、年龄等不属同一种数据类型。年龄等不属同一种数据类型。n nC
3、 C语言中用语言中用“结构体结构体”来描述由多个不同类型的数据组成的来描述由多个不同类型的数据组成的数据集合。相当于其他高级语言中的数据集合。相当于其他高级语言中的“记录记录”.”.11.1结构体类型的定义结构体类型的定义n n与基本数据类型不同的是,结构体是又一种构造类型,是由与基本数据类型不同的是,结构体是又一种构造类型,是由多个类型的数据成员组合而来的。因此该类型的具体内容应多个类型的数据成员组合而来的。因此该类型的具体内容应根据需要先定义,后使用。根据需要先定义,后使用。n n可以定义如下结构体类型来描述教师的基本情况:可以定义如下结构体类型来描述教师的基本情况:struct teac
4、her struct teacher /*struct/*struct 是关键字是关键字是关键字是关键字*/*/char name30;char name30;/*/*内是该类型的各成员内是该类型的各成员内是该类型的各成员内是该类型的各成员*/*/char sex;char sex;int age;int age;char position10;char position10;float salary;float salary;/*/*语句末尾是语句末尾是“;”*/“;”*/该结构体类型名为该结构体类型名为struct teacherstruct teacher,teacher teacher
5、 是该结构体的标识符;是该结构体的标识符;该类型包含有该类型包含有6 6个成员的数据项:个成员的数据项:namename、sex sex、age age、position position 和和salarysalary,其中每个成员项都有自己的类型。,其中每个成员项都有自己的类型。n n可见,定义一种新的结构体类型的一般形式是:可见,定义一种新的结构体类型的一般形式是:struct struct 结构体类型名结构体类型名结构体类型名结构体类型名 成员类型成员类型成员类型成员类型 成员名;成员名;成员名;成员名;成员类型成员类型成员类型成员类型 成员名;成员名;成员名;成员名;其中,其中,str
6、uct struct 是是 关键字,结构体类型名、结构体成员名的命关键字,结构体类型名、结构体成员名的命名规则同变量的命名规则一样。名规则同变量的命名规则一样。特别提示:特别提示:struct teacherstruct teacher只是一种具体的结构体类型,根据只是一种具体的结构体类型,根据需要,程序员可以定义多个不同内容的结构体类型。其中的需要,程序员可以定义多个不同内容的结构体类型。其中的成员项是该类型的组成部分,而不是变量。成员项是该类型的组成部分,而不是变量。结构体类型的成员可以是基本类型的变量或数组,也可以是结结构体类型的成员可以是基本类型的变量或数组,也可以是结构体类型的数据。
7、即构体类型的数据。即结构体类型的嵌套定义结构体类型的嵌套定义结构体类型的嵌套定义结构体类型的嵌套定义。例如,若将教师的年龄改为出生日期,则可以将出生日期定义例如,若将教师的年龄改为出生日期,则可以将出生日期定义为一个结构体类型,然后嵌入为一个结构体类型,然后嵌入 struct teacher struct teacher中。中。n n将出生日期单独定义为一个结将出生日期单独定义为一个结构体类型后再嵌入。构体类型后再嵌入。n nStruct date_typeStruct date_type int year;int year;int month;int month;int day;int da
8、y;Struct teacher_2Struct teacher_2 char name30;char name30;char sex;char sex;struct date_type birthday;struct date_type birthday;char position10;char position10;float salary;float salary;(常用常用常用常用)n n直接嵌入。直接嵌入。Struct teacher_3Struct teacher_3 char name30;char name30;char sex;char sex;struct date_typ
9、e struct date_type int year;int year;int month;int month;int day;int day;birthday;birthday;char position10;char position10;float salary;float salary;/*/*成员成员成员成员birthdaybirthday又是一个结又是一个结又是一个结又是一个结构体类型的数据构体类型的数据构体类型的数据构体类型的数据。*/*/11.2结构体变量的定义及引用结构体变量的定义及引用n n经以上定义后,结构体类型经以上定义后,结构体类型struct teacherstr
10、uct teacher与系统定与系统定义的类型义的类型intint、longlong、float float 等一样,可以用它来定等一样,可以用它来定义该类型的变量、数组、函数等。义该类型的变量、数组、函数等。不同的是:不同的是:结构体类型的作用范围是有限制的。在结构体类型的作用范围是有限制的。在函数体内定义的结构体类型的作用域为本函数内,函数体内定义的结构体类型的作用域为本函数内,在函数体外定义的结构体类型的作用域为本程序在函数体外定义的结构体类型的作用域为本程序文件内,若要引用不在本文件内的结构体类型,文件内,若要引用不在本文件内的结构体类型,通常用通常用#include#include命
11、令将定义该类型的文件包含进命令将定义该类型的文件包含进来。来。例例11.111.1定义一个结构体变量,用于存放一个教师的信定义一个结构体变量,用于存放一个教师的信息,然后将其输出。息,然后将其输出。#include stdio.h#include stdio.hmain()main()struct teacher /*struct teacher /*该类型的作用范围在本函数内该类型的作用范围在本函数内该类型的作用范围在本函数内该类型的作用范围在本函数内*/*/char name30;char name30;char sex;char sex;int age;int age;char posi
12、tion10;float salary;char position10;float salary;struct teacher person;/*struct teacher person;/*定义结构体变量定义结构体变量定义结构体变量定义结构体变量person*/person*/strcpy(person.name,wang li);strcpy(person.name,wang li);person.sex=f;/*person.sex=f;/*给各成员赋值给各成员赋值给各成员赋值给各成员赋值*/*/person.age=30;person.age=30;strcpy(person.pos
13、ition,middle);strcpy(person.position,middle);person.salary=1600;person.salary=1600;printf(n name sex age position salary);printf(n name sex age position salary);printf(n%-10s%3c%5d%10s%8.2f,person.name,printf(n%-10s%3c%5d%10s%8.2f,person.name,person.sex,person.age,person.position,person.salary);pers
14、on.sex,person.age,person.position,person.salary);分析:分析:*本例中本例中结构体类型在函数体内定义,其作用范围在本函数体内。结构体类型在函数体内定义,其作用范围在本函数体内。结构体类型在函数体内定义,其作用范围在本函数体内。结构体类型在函数体内定义,其作用范围在本函数体内。*先定义结构体类型,后定义结构体变量。先定义结构体类型,后定义结构体变量。*对结构体变量输入输出操作、或将基本类型的数据赋给结构体对结构体变量输入输出操作、或将基本类型的数据赋给结构体变量时,需分别访问各个基本类型的成员,变量时,需分别访问各个基本类型的成员,不能整体赋值或输
15、不能整体赋值或输不能整体赋值或输不能整体赋值或输入输出。入输出。入输出。入输出。如:如:printf(“%s%c%d%s%f”,person);printf(“%s%c%d%s%f”,person);错!错!person=“li li”,f,24,“primary”,1000;person=“li li”,f,24,“primary”,1000;错!错!n n例例11.2 11.2 定义一个结构体类型,包含通讯录中的如下信息:定义一个结构体类型,包含通讯录中的如下信息:姓名、年龄、电话、通讯地址;并定义该类型的变量,姓名、年龄、电话、通讯地址;并定义该类型的变量,输入数据并输出。输入数据并输出
16、。n n程序程序l11_2.cl11_2.c#include stdio.h#include stdio.hstruct address_list /*struct address_list /*在函数体外定义结构体类型在函数体外定义结构体类型在函数体外定义结构体类型在函数体外定义结构体类型*/*/char name10;/*char name10;/*该类型的作用域为本程序内该类型的作用域为本程序内该类型的作用域为本程序内该类型的作用域为本程序内*/*/int age;int age;char tel10;char tel10;char address40;char address40;ma
17、in()main()struct address_list sstruct address_list s;/*;/*定义变量定义变量定义变量定义变量s s,占空间,占空间,占空间,占空间6262个字节个字节个字节个字节*/*/printf(n input name:);printf(n input name:);gets(s.name)gets(s.name);printf(input age:);printf(input age:);scanf(%d,&s.age);getchar();scanf(%d,&s.age);getchar();printf(input tel:);printf(
18、input tel:);gets(s.tel);gets(s.tel);printf(input address:);printf(input address:);gets(s.address);gets(s.address);printf(name age tel address);printf(name age tel address);printf(n%5s%6d%10s%-40s,s.name,s.age,s.tel,printf(n%5s%6d%10s%-40s,s.name,s.age,s.tel,s.address);s.address);分析:分析:*结构体类型结构体类型add
19、ress_list address_list 放在函数体外定义,其作用范围为放在函数体外定义,其作用范围为本程序文件内。本程序文件内。*结构体变量的输入输出需逐个访问基本类型的成员,引用结构体变量的输入输出需逐个访问基本类型的成员,引用方法与同类型的变量、数组相同。方法与同类型的变量、数组相同。n n例例11.3 11.3 定义一结构体类型,包含工人的工资信息:编号、姓定义一结构体类型,包含工人的工资信息:编号、姓名、工资。并定义变量存放两人的数据,然后交换,输出交名、工资。并定义变量存放两人的数据,然后交换,输出交换前后的信息。换前后的信息。n n程序程序l11_3.cl11_3.c#inc
20、lude stdio.h#include stdio.hmain()main()struct salary_liststruct salary_list char no10;char no10;char name30;char name30;float salary;float salary;struct salary_list z,x=10,li ming,2000,struct salary_list z,x=10,li ming,2000,y=12,wang yan,2500;y=12,wang yan,2500;/*/*结构体变量的初始化,给出各成员的数据并用结构体变量的初始化,给出各
21、成员的数据并用括起来,括起来,各成员之间用逗号分开各成员之间用逗号分开*/*/printf(n no name salary);printf(n no name salary);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);z=x;x=y;y=z;/*z=x;x=y;y
22、=z;/*交换两个结构体变量交换两个结构体变量*/*/printf(nafter exchange:);printf(nafter exchange:);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(nx:%-5s%-6s%10.2f,x.no,x.name,x.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);printf(ny:%-5s%-6s%10.2f,y.no,y.name,y.salary);特别提示:特别提示:同类型同类型同类型同类型的结构体变量可以整体赋值,
23、即可的结构体变量可以整体赋值,即可以将一个结构体变量整体赋给相同类型的另一个结以将一个结构体变量整体赋给相同类型的另一个结构体变量。构体变量。说明一、定义结构体变量n n定义结构体变量的方法有三种,(经常用第一种):定义结构体变量的方法有三种,(经常用第一种):定义结构体变量的方法有三种,(经常用第一种):定义结构体变量的方法有三种,(经常用第一种):方法一:先定义结构体类型,再定义结构体变量。方法一:先定义结构体类型,再定义结构体变量。方法一:先定义结构体类型,再定义结构体变量。方法一:先定义结构体类型,再定义结构体变量。如:如:如:如:struct teacher t1,t2;struct
24、 teacher t1,t2;(例(例(例(例11.1)11.1)方法二:定义结构体类型的同时定义结构体变量方法二:定义结构体类型的同时定义结构体变量方法二:定义结构体类型的同时定义结构体变量方法二:定义结构体类型的同时定义结构体变量(例例例例11.2)11.2)。又如:又如:又如:又如:struct course mathstruct course math long no;4B long no;4B char name30;char name30;math,english;30B math,english;30B 若以后还需用到此结构体类型,定义方法同若以后还需用到此结构体类型,定义方法同
25、若以后还需用到此结构体类型,定义方法同若以后还需用到此结构体类型,定义方法同1 1:struct course chemic;struct course chemic;方法三方法三方法三方法三:格式同方法(二),其中类型名格式同方法(二),其中类型名格式同方法(二),其中类型名格式同方法(二),其中类型名course course 省略,缺点是该省略,缺点是该省略,缺点是该省略,缺点是该类型无法再次引用类型无法再次引用类型无法再次引用类型无法再次引用。*结构体变量的存储:系统按结构体类型中各成员的类型给变量结构体变量的存储:系统按结构体类型中各成员的类型给变量结构体变量的存储:系统按结构体类型
26、中各成员的类型给变量结构体变量的存储:系统按结构体类型中各成员的类型给变量分配存储空间。如上图:分配存储空间。如上图:分配存储空间。如上图:分配存储空间。如上图:no name说明二、结构体变量的引用n n结构体变量定义后,可以分两个层次引用:结构体变量定义后,可以分两个层次引用:*访问结构体变量的成员。访问结构体变量的成员。*引用整个结构体变量引用整个结构体变量。n n1 1、使用成员运算符、使用成员运算符、使用成员运算符、使用成员运算符“.”“.”引用结构体变量的成员引用结构体变量的成员引用结构体变量的成员引用结构体变量的成员,“.”“.”的优先级仅次于括号。的优先级仅次于括号。如例如例1
27、1.111.1、11.211.2、11.311.3中的中的person.name,person.age x.no,s,salaryperson.name,person.age x.no,s,salary等成员的赋值、等成员的赋值、输入、输出。输入、输出。person.age+person.age+等价于(等价于(person.age)+person.age)+对结构体变量中的成员的操作与基本类型的变量完全相同。对结构体变量中的成员的操作与基本类型的变量完全相同。注意:当结构体类型嵌套定义时,应逐级访问。注意:当结构体类型嵌套定义时,应逐级访问。如如struct teacher_2 pp;pp.
28、birthday.year=1999;struct teacher_2 pp;pp.birthday.year=1999;2 2、相同类型的结构体变量之间可以整体赋值。相同类型的结构体变量之间可以整体赋值。相同类型的结构体变量之间可以整体赋值。相同类型的结构体变量之间可以整体赋值。如例如例11.311.3中交中交换两个结构体变量的值。换两个结构体变量的值。11.2结构体数组结构体数组n n结构体数组用于保存一批同类型的结构体数据。每个数组结构体数组用于保存一批同类型的结构体数据。每个数组结构体数组用于保存一批同类型的结构体数据。每个数组结构体数组用于保存一批同类型的结构体数据。每个数组元素相当
29、于一个结构体变量。元素相当于一个结构体变量。元素相当于一个结构体变量。元素相当于一个结构体变量。n n例:例:例:例:11.411.4输入三门课的信息(课程编号、课程名),并输出。输入三门课的信息(课程编号、课程名),并输出。输入三门课的信息(课程编号、课程名),并输出。输入三门课的信息(课程编号、课程名),并输出。n n分析:分析:分析:分析:*每门课的信息包含每门课的信息包含每门课的信息包含每门课的信息包含2 2项,用结构体类型表示,其成员有两项,用结构体类型表示,其成员有两项,用结构体类型表示,其成员有两项,用结构体类型表示,其成员有两项,即课程编号和课程名。项,即课程编号和课程名。项,
30、即课程编号和课程名。项,即课程编号和课程名。*三门课的信息,用一维数组保存。三门课的信息,用一维数组保存。三门课的信息,用一维数组保存。三门课的信息,用一维数组保存。输入:可以赋初值,也可由用户输入,本例中采用赋初值输入:可以赋初值,也可由用户输入,本例中采用赋初值输入:可以赋初值,也可由用户输入,本例中采用赋初值输入:可以赋初值,也可由用户输入,本例中采用赋初值的方式。的方式。的方式。的方式。程序程序程序程序l11_2_1.cl11_2_1.c 说明:结构体数组的初始化同基本类型的一维数组,只不过说明:结构体数组的初始化同基本类型的一维数组,只不过说明:结构体数组的初始化同基本类型的一维数组
31、,只不过说明:结构体数组的初始化同基本类型的一维数组,只不过每个数组元素是用每个数组元素是用每个数组元素是用每个数组元素是用括起的一个结构体常量。括起的一个结构体常量。括起的一个结构体常量。括起的一个结构体常量。数组元素中每个成员的访问,同变量的成员的访问。数组元素中每个成员的访问,同变量的成员的访问。数组元素中每个成员的访问,同变量的成员的访问。数组元素中每个成员的访问,同变量的成员的访问。n n例例11.511.5输入输入N N个学生的学号、姓名、三门课的成绩,个学生的学号、姓名、三门课的成绩,计算每人的平均成绩,并按平均成绩由高到低排序,计算每人的平均成绩,并按平均成绩由高到低排序,输出
32、排序后的成绩表。输出排序后的成绩表。n n分析:分析:*每个学生的信息包括多项,用结构体类型表示,每个学生的信息包括多项,用结构体类型表示,其成员有学号、姓名、三门课的成绩、平均成绩。其成员有学号、姓名、三门课的成绩、平均成绩。N N个学生的信息用一维数组保存。个学生的信息用一维数组保存。*算法算法:输入并计算平均成绩、排序、输出三步。输入并计算平均成绩、排序、输出三步。n n可将后面两项功能分别用函数实现,在主函数中调可将后面两项功能分别用函数实现,在主函数中调用。设排序函数为用。设排序函数为sort(),sort(),输出函数为输出函数为output().output().n n分析每个函
33、数的具体组成:分析每个函数的具体组成:函数类型函数类型 参数参数 函数体函数体程序程序l11_2_2.cl11_2_2.c/*/*例例11.511.5程序程序*/*/struct stustruct stu char no8;char no8;char name10;char name10;float score3;float score3;float aver;float aver;#include stdio.h#include stdio.h#include stdlib.h#include stdlib.h#define N 3#define N 3#define STU_SC str
34、uct stu#define STU_SC struct stumain()main()void sort(STU_SC sc1 ),output(STU_SC sc2 );void sort(STU_SC sc1 ),output(STU_SC sc2 );STU_SC sc_listN;STU_SC sc_listN;int i,j;char temp10;float sum;int i,j;char temp10;float sum;printf(n input no,name,score(13):);printf(n input no,name,score(13):);for(i=0;
35、iN;i+)for(i=0;iN;i+)printf(nstudent%d:n,i+1);printf(nstudent%d:n,i+1);sum=0;sum=0;printf(no:);gets(sc_listi.no);printf(no:);gets(sc_listi.no);printf(name:);gets(sc_listi.name);printf(name:);gets(sc_listi.name);for(j=0;j3;j+)for(j=0;j3;j+)printf(score%d:,j+1);gets(temp);printf(score%d:,j+1);gets(temp
36、);sc_listi.scorej=atof(temp);sc_listi.scorej=atof(temp);sum+=sc_listi.scorej;sum+=sc_listi.scorej;sc_listi.aver=sum/3;sc_listi.aver=sum/3;sort(sc_list);sort(sc_list);output(sc_list);output(sc_list);void sort(STU_SC sc1)void sort(STU_SC sc1)int i,j,k;STU_SC t;int i,j,k;STU_SC t;for(i=0;iN-1;i+)for(i=
37、0;iN-1;i+)k=i;k=i;for(j=i+1;jN;j+)for(j=i+1;jsc1k.aver)k=j;if(sc1j.aversc1k.aver)k=j;if(k!=i)t=sc1k;sc1k=sc1i;sc1i=t;if(k!=i)t=sc1k;sc1k=sc1i;sc1i=t;void output(STU_SC sc2)void output(STU_SC sc2)int i;int i;printf(n no name score1 score2 score3 printf(n no name score1 score2 score3 aver);aver);for(i
38、=0;iN;i+)for(i=0;ireal,p-imagep-real,p-image););/*/*通过通过通过通过p p访问访问访问访问x*/x*/运行结果:运行结果:运行结果:运行结果:2+3i2+3i 2+3i /2+3i /*两个输出结果相同两个输出结果相同*/*/23n n使用指向结构体数据的指针变量引用结构体成员的一般格式:使用指向结构体数据的指针变量引用结构体成员的一般格式:指针变量名指针变量名指针变量名指针变量名-成员名成员名成员名成员名-为指向运算符,即取指针变量指向的结构体数据的成员。如:为指向运算符,即取指针变量指向的结构体数据的成员。如:p-real p-real
39、等价于等价于(*p).real (*p).real 其含义为:取指针变量其含义为:取指针变量p p指向的结构体数据的成员指向的结构体数据的成员realreal。例例11.3.211.3.2使用指向结构体数组元素的指针引用数组元素:输入使用指向结构体数组元素的指针引用数组元素:输入输出输出N N个复数。个复数。分析:复数用结构体类型表示,输入时用下标法引用数组元素,分析:复数用结构体类型表示,输入时用下标法引用数组元素,输出实用指针引用各元素。输出实用指针引用各元素。注意:注意:p+p+的含义是的含义是p p指向下一个数组元素。指向下一个数组元素。为了引用已定义的结构体类型,通常将结构体类型名定
40、义为为了引用已定义的结构体类型,通常将结构体类型名定义为更简单的宏名。更简单的宏名。struct complexstruct complex int real;int real;int image;int image;#define COMPLEX struct complex#define COMPLEX struct complex#define N 5#define N 5main()main()COMPLEX ssN,*p;int i;COMPLEX ssN,*p;int i;printf(n input%d complex:n,N);printf(n input%d complex:
41、n,N);for(i=0;iN;i+)/*for(i=0;iN;i+)/*使用下标法引用元素,使用使用下标法引用元素,使用“.”“.”引用成员引用成员*/*/scanf(%d%d,&ssi.real,&ssi.image);scanf(%d%d,&ssi.real,&ssi.image);for(p=ss;pss+N;p+)/*for(p=ss;p”“-”引用成员引用成员*/*/printf(n%d+%di,p-real,p-image);printf(n%d+%di,p-real,p-image);11.4动态内存分配与链表动态内存分配与链表n n动态内存分配的引入动态内存分配的引入n n问
42、题:如果要在内存中保存一个班学生的数据,按照现有的问题:如果要在内存中保存一个班学生的数据,按照现有的手段,首先要知道该班的人数,然后据此定义数组,可是,手段,首先要知道该班的人数,然后据此定义数组,可是,每一个班的人数并不完全相同,并且是浮动的,用确定长度每一个班的人数并不完全相同,并且是浮动的,用确定长度的数组无法保存任意班级学生的数据,如果定义的数组太大,的数组无法保存任意班级学生的数据,如果定义的数组太大,造成内存浪费,太小将导致程序无法实现原功能要求。这显造成内存浪费,太小将导致程序无法实现原功能要求。这显然不够理想和灵活。然不够理想和灵活。n n解决以上问题的方法是使用动态内存分配
43、:在程序运行中实解决以上问题的方法是使用动态内存分配:在程序运行中实时申请内存分配,申请到的内存在不用时还可以随时释放。时申请内存分配,申请到的内存在不用时还可以随时释放。这样就可以根据每次运行程序时要处理的数据的多少随时申这样就可以根据每次运行程序时要处理的数据的多少随时申请内存,因此可以处理任意人数的数据。请内存,因此可以处理任意人数的数据。n n用于动态内存分配的和释放的函数:用于动态内存分配的和释放的函数:(1 1)malloc()malloc()函数原型:函数原型:void *malloc(unsigned int size)void *malloc(unsigned int siz
44、e)功能:申请分配功能:申请分配sizesize字节的连续内存空间。若分配成功,字节的连续内存空间。若分配成功,函数返回所分配内存的首地址;否则返回空指针函数返回所分配内存的首地址;否则返回空指针(NULLNULL)。)。(2 2)calloc()calloc()函数原型函数原型:void *calloc(unsigned int n,unsigned int size):void *calloc(unsigned int n,unsigned int size)功能:申请分配功能:申请分配n n各连续的内存空间、每个空间为各连续的内存空间、每个空间为sizesize字节。字节。若成功,返回所
45、分配内存的首地址;否则返回空指针若成功,返回所分配内存的首地址;否则返回空指针(NULLNULL)。)。(3 3)free()free()函数原型:函数原型:void free(void *p)void free(void *p)功能:释放以前分配到的、指针功能:释放以前分配到的、指针p p指向的内存空间。无返指向的内存空间。无返回值。回值。n n例例11.4.111.4.1编程实现:输入一批实验数据编程实现:输入一批实验数据(整型整型),计算,计算其平均值。(个数由用户输入)其平均值。(个数由用户输入)#include#include#include#include main()main()
46、int n,i,*p;float sum=0;int n,i,*p;float sum=0;printf(n input datas num:);printf(n input datas num:);scanf(%d,&n);scanf(%d,&n);p=(int*)malloc(sizeof(float)*n);p=(int*)malloc(sizeof(float)*n);if(!p)if(!p)printf(n falure.);exit(0);printf(n falure.);exit(0);printf(n input%d integer:,n);printf(n input%d
47、integer:,n);for(i=0;in;i+,p+)for(i=0;inext=p1;p2-next=p1;然后然后p2p2后移:后移:p2=p1;p2=p1;使得使得p2p2始终指向结点。重复以上过程。始终指向结点。重复以上过程。申请一个结点空间并输入数据struct work*input()struct work*input()struct work*q;float x;struct work*q;float x;q=(struct work*)malloc(LEN);q=(struct work*)malloc(LEN);if(!q)printf(n failure.);exit(
48、0);if(!q)printf(n failure.);exit(0);printf(n input a workers information(no=0 for printf(n input a workers information(no=0 for end):n);end):n);printf(no:);scanf(%ld,&q-no);getchar();printf(no:);scanf(%ld,&q-no);getchar();printf(name:);gets(q-name);printf(name:);gets(q-name);printf(salary:);scanf(%f
49、,&x);q-salary=x;printf(salary:);scanf(%f,&x);q-salary=x;getchar();getchar();return(q);/*return(q);/*返回该结点的首地址返回该结点的首地址返回该结点的首地址返回该结点的首地址*/*/建立链表,返回头指针struct work*create(void)struct work*create(void)struct work*head,*p1,*p2;struct work*head,*p1,*p2;int n=0;int n=0;p1=p2=input();p1=p2=input();head=NUL
50、L;head=NULL;while(p1-no!=0)while(p1-no!=0)n+;n+;if(n=1)head=p1;if(n=1)head=p1;else p2-next=p1;else p2-next=p1;p2=p1;p2=p1;p1=input();/*p1=input();/*输入下一个人的信息输入下一个人的信息输入下一个人的信息输入下一个人的信息*/*/p2-next=NULL;p2-next=NULL;return(head);return(head);二、添加结点n n功能:在链表的末尾追加多个结点,直至输入的结点功能:在链表的末尾追加多个结点,直至输入的结点编号等于编