《构造数据类型精选PPT.ppt》由会员分享,可在线阅读,更多相关《构造数据类型精选PPT.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、构造数据类型2022/10/51第1页,此课件共77页哦9.1 结构体数据类型结构体数据类型 前面介绍的变量都只包含一种类型前面介绍的变量都只包含一种类型,但在实际问题中,常常,但在实际问题中,常常要求把一些属于不同类型的数据作为一个整体来处理。要求把一些属于不同类型的数据作为一个整体来处理。如:一个职员的编号、姓名、年龄、性别、身份证号码、民族、如:一个职员的编号、姓名、年龄、性别、身份证号码、民族、文化程度、职务、住址、联系电话等等。文化程度、职务、住址、联系电话等等。由一些不同类型的数据组合而成的数据整体,由一些不同类型的数据组合而成的数据整体,C语言语言称之为称之为“结构体结构体”类型
2、类型,结构体中所包含的数据元素称之为,结构体中所包含的数据元素称之为成员成员。2022/10/52第2页,此课件共77页哦9.1.2 结构的概念与定义使用结构来表示通讯录信息:struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;结构:结构:构造数据类型构造数据类型,把有内在联系的,把有内在联系的不同类型的数不同类型的数据据统一成一个整体,使它们相互关联统一成一个整体,使它们相互关联结构又是变量的集合,可以单独使用其成员结构又是变量的集合,可以单独使用其成员2022/10/53
3、第3页,此课件共77页哦结构的定义结构类型定义的一般形式为:结构类型定义的一般形式为:struct 结构名结构名 类型名类型名 结构成员名结构成员名1;类型名类型名 结构成员名结构成员名2;类型名类型名 结构成员名结构成员名n;;结构的定义以分号结束,结构的定义以分号结束,被看作一条语句被看作一条语句 关键字关键字struct和它后面的和它后面的结构名一起组成一个新结构名一起组成一个新的数据类型名的数据类型名 2022/10/54第4页,此课件共77页哦结构体类型的特点:结构体类型的特点:结构体名为任何合法的标识符,建议用具有一结构体名为任何合法的标识符,建议用具有一定意义的单词或组合作为结构
4、体名。定意义的单词或组合作为结构体名。虽然成员的类型定义形式同简单变量,但虽然成员的类型定义形式同简单变量,但不不能直接使用能直接使用。定义结构体类型只是定义结构体类型只是定义类型定义类型而不是定义变而不是定义变量。量。2022/10/55第5页,此课件共77页哦结构定义示例定义平面坐标结构:struct point double x;double y;虽然x、y的类型相同,也可以用数组的方式表示,但采用结构体描述整体性更强,增加了程序的可读性,使程序更清晰。2022/10/56第6页,此课件共77页哦9.1.3 结构的嵌套定义在实际生活中,一个较大的实体可能由多个成员构成,而这些成员中有些又
5、有可能是由一些更小的成员构成的实体。在手机通讯录中,增加“通信地址”姓名性别年龄 通信地址联系电话电子邮箱城市街道门牌号邮编2022/10/57第7页,此课件共77页哦结构的嵌套定义struct address char city10;char street20;int code;int zip;struct nest_friendslist char name10;int age;struct address addr;char telephone13;nest_friend;在定义嵌套的结构类型时,必须先定义成员的在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。结构类型
6、,再定义主结构类型。姓名性别年龄 通信地址联系电话电子邮箱城市街道门牌号邮编2022/10/58第8页,此课件共77页哦9.2 结构变量 9.2.1 结构变量的定义和初始化结构变量的定义和初始化9.2.2 结构变量的使用结构变量的使用2022/10/59第9页,此课件共77页哦9.2.1结构变量的定义和初始化三种定义结构变量的方式:1.单独定义单独定义先定义结构类型结构类型,再定义具有这种结构类型的变量 struct friends_list char name10;/*姓名*/int age;/*年龄*/char telephone13;/*联系电话*/;struct friends_lis
7、t friend1,friend2;2022/10/510第10页,此课件共77页哦结构变量的定义2.混合定义混合定义在定义结构体类型的同时定义结构体变量 struct friends_listchar name10;int age;char telephone13;friend1,friend2;3.无类型名定义无类型名定义在定义结构体变量时省略结构体名struct char name10;int age;char telephone13;friend1,friend2;2022/10/511第11页,此课件共77页哦结构变量的初始化 struct friends_list friend1=
8、Zhang,26,0571-85171880 ;name age telephone Zhang260571-852718802022/10/512第12页,此课件共77页哦9.2.2 结构变量的使用1.结构变量成员的引用结构变量名结构变量名.结构成员名结构成员名friend1.age=26;strcpy(friend1.name,Zhang San);nest_friend.addr.zip2022/10/513第13页,此课件共77页哦2、将结构体变量作为一个整体来使用。、将结构体变量作为一个整体来使用。可以将一个结构体变量作为一个整体赋给另一个结可以将一个结构体变量作为一个整体赋给另一个
9、结构体变量,条件是这两个变量必须构体变量,条件是这两个变量必须具有相同的结构体类型具有相同的结构体类型。例如:例如:struct friend_list doctor=“Li Ming”,24,88753540;struct friend_list teacher;teacher=doctor;/*将结构体变量将结构体变量doctor的值赋给的值赋给teacher*/这样,变量这样,变量teacher中各成员的值均与中各成员的值均与doctor 的成员的值相同。的成员的值相同。2022/10/514第14页,此课件共77页哦【例例9-1】阅读下面的程序,了解结构体成员的使用阅读下面的程序,了解
10、结构体成员的使用/*exam9_1.c 结构体成员的使用结构体成员的使用*/#include#include struct scoreint math;int eng;int comp;struct stu char name12;char sex;long StuClass;struct score sub;2022/10/515第15页,此课件共77页哦main()struct stu student1=Li Ming,M,990324,88,80,90;struct stu student2;student2=student1;student2.name0=H;student2.name
11、1=u;student2.StuClass=990325;student2.sub.math=83;printf(Record1-%s,%c,%ld,%d,%d,%dn,student1.name,student1.sex,student1.StuClass,student1.sub.math,student1.sub.eng,p);printf(Record2-%s,%c,%ld,%d,%d,%dn,student2.name,student2.sex,student2.StuClass,student2.sub.math,student2.sub.eng,p);程序运行结果程序运行结果:R
12、ecord1-Li Ming,M,990324,88,80,90Record1-Hu Ming,M,990325,83,80,90 2022/10/516第16页,此课件共77页哦9.1.5 结构型变量成员的输入结构型变量成员的输入/输出输出 对变量的成员进行输入对变量的成员进行输入/输出,如下所示:输出,如下所示:scanf(“%s%s%ld”,stud.name,stud.addr,&stud.zip);printf(“%s,%s,%ldn”,stud.name,stud.addr,stud.zip);也可以用也可以用gets函数和函数和puts函数输入和输出一个结构变量中字符函数输入和输
13、出一个结构变量中字符数组成员。如:数组成员。如:gets(stud.name);/*输入一个字符串给输入一个字符串给stud.name*/puts(stud.name);/*将将stud.name数组中的字符串输出到显示数组中的字符串输出到显示器器*/2022/10/517第17页,此课件共77页哦9.2 结构体数组结构体数组 结构体数组结构体数组,亦即数组中每一个元素都是一个结,亦即数组中每一个元素都是一个结构体变量。构体变量。9.2.1 结构体数组的定义结构体数组的定义 结构体数组的定义方法与结构体变量的定义方法相同。结构体数组的定义方法与结构体变量的定义方法相同。一、一、先先定义定义结构
14、体结构体,再再定义结构体定义结构体数组数组:struct ;struct ;2022/10/518第18页,此课件共77页哦二、在定义结构体的二、在定义结构体的同时同时,定义结构体数组:,定义结构体数组:struct ;三、直接定义结构体变量而不定义结构体名;三、直接定义结构体变量而不定义结构体名;struct ;2022/10/519第19页,此课件共77页哦9.2.2 结构体数组成员的初始化和引用结构体数组成员的初始化和引用 结构体数组成员的值也可以初始化,初始化的形结构体数组成员的值也可以初始化,初始化的形式与式与二维数组二维数组的初始化形式类似。的初始化形式类似。例如:例如:struc
15、t student stu30=“LiFei”,“DongFeng Road 14”,430038,“LiMing”,“zhongshan Road 378”,430082,“LiYong”,“Xiao Shan Road 25”,430001;2022/10/520第20页,此课件共77页哦 结构体数组的引用完全类似于结构体变量的引用,只是结构体数组的引用完全类似于结构体变量的引用,只是用用结构体数组元素结构体数组元素来代替来代替结构体变量结构体变量,其他规则不变,如,其他规则不变,如下面所示:下面所示:*/引用某一元素的成员引用某一元素的成员 */stu0.namestu0.agestu0
16、=stu2;*/将结构体数组元素作为一个整体来使用将结构体数组元素作为一个整体来使用*/2022/10/521第21页,此课件共77页哦9.3 结构体变量与函数结构体变量与函数 一、函数的形参与实参为结构型一、函数的形参与实参为结构型【例例9-2】下面的程序是计算四种书的购书情况,并输出统计结下面的程序是计算四种书的购书情况,并输出统计结果。果。分析分析,定义一个结构体类型定义一个结构体类型BookLib,用来描述购书的信息用来描述购书的信息,还定义了一个函数还定义了一个函数list,它的参数为结构型变量它的参数为结构型变量,函数的作函数的作用是计算购书的总费用并输出所有信息。用是计算购书的总
17、费用并输出所有信息。在主程序中,定义了一个临时字符数组变量在主程序中,定义了一个临时字符数组变量temp15,用于,用于将用户输入的两个数值:一个是书的数目将用户输入的两个数值:一个是书的数目num,另一个是书,另一个是书的价格的价格price作为字符串来接收,然后通过作为字符串来接收,然后通过atoi()函数和函数和atof()函数将函数将temp转成整型值和实型值。转成整型值和实型值。2022/10/522第22页,此课件共77页哦/*exam9_2.c 函数的参数为结构类型函数的参数为结构类型*/#include#include#include struct BookLib char n
18、ame12;int num;float price;float SumMoney;2022/10/523第23页,此课件共77页哦main()void list(struct BookLib StuBook);struct BookLib Book4;int i;char temp15;for(i=0;i4;i+)printf(Please input data of book(%d):Name Number Pricen,i+1);gets(Booki.name);gets(temp);Booki.num=atoi(temp);gets(temp);Booki.price=atof(temp
19、);2022/10/524第24页,此课件共77页哦printf(-n);printf(name num price SumMoneyn);for(i=0;i4;i+)list(Booki);void list(struct BookLib StuBook)StuBook.SumMoney=StuBook.num*StuBook.price;printf(%-12s%5d%6.2f%9.2fn,StuBook.name,StuBook.num,StuBook.price,StuBook.SumMoney);2022/10/525第25页,此课件共77页哦程序运行结果程序运行结果:Please
20、input data of book:Name Number PriceComputer 300 18.6 Please input data of book:Name Number PriceMathematics 600 15.5 Please input data of book:Name Number PriceEnglish 360 22.8 Please imput data of book:Name Number PriceChemistry 150 14.2 2022/10/526第26页,此课件共77页哦-name num price SumMoneyComputer 300
21、 18.60 5580.00Mathematics 600 15.50 9300.00English 360 22.80 8208.00Chemistry 150 14.20 2130.002022/10/527第27页,此课件共77页哦二、函数的返回值类型为结构型二、函数的返回值类型为结构型 C标准中还允许函数的返回值为结构体类型的值。标准中还允许函数的返回值为结构体类型的值。【例例9-3】把上面这个程序例子稍作修改,将数据输入用一个函数把上面这个程序例子稍作修改,将数据输入用一个函数NewBook()来实现。来实现。/*exam9_3.c 函数的返回值为结构类型函数的返回值为结构类型*/#
22、include#include#include 2022/10/528第28页,此课件共77页哦struct BookLibchar name12;int num;float price;float SumMoney;void list(struct BookLib StuBook)StuBook.SumMoney=StuBook.num*StuBook.price;printf(%-12s%5d%6.2f%9.2fn,StuBook.name,StuBook.num,StuBook.price,StuBook.SumMoney);2022/10/529第29页,此课件共77页哦struct
23、BookLib NewBook()struct BookLib book;char temp15;printf(Please input data of book:Name Number Pricen);gets(book.name);gets(temp);book.num=atoi(temp);gets(temp);book.price=atof(temp);return(book);2022/10/530第30页,此课件共77页哦main()struct BookLib Book4;int i;for(i=0;i4;i+)Booki=NewBook();printf(-n);printf(
24、name num price SumMoneyn);for(i=0;i4;i+)list(Booki);程序中定义了两个函数:无返回值的函数程序中定义了两个函数:无返回值的函数list(),返回值为结构,返回值为结构体类型变量的函数体类型变量的函数NewBook()用来给结构体变量数组赋值。用来给结构体变量数组赋值。2022/10/531第31页,此课件共77页哦例例9-4 构建简单的手机通讯录构建简单的手机通讯录联系人的基本信息:姓名、年龄和联系电话联系人的基本信息:姓名、年龄和联系电话最多容纳最多容纳50名联系人的信息名联系人的信息 具有新建和查询功能具有新建和查询功能2022/10/53
25、2第32页,此课件共77页哦程序解析程序结构程序结构程序结构主函数主函数main:程序的总体控制:程序的总体控制函数函数new_friend:新建联系人功能:新建联系人功能函数函数search_friend:查询联系人功能:查询联系人功能 main()new_friend()search_friend()2022/10/533第33页,此课件共77页哦程序解析数据类型程序解析数据类型/变量变量数据类型数据类型/变量变量结构类型结构类型struct friends_list:在程序首部定义,其中:在程序首部定义,其中的成员分别代表联系人的基本信息的成员分别代表联系人的基本信息struct fri
26、ends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;结构数组结构数组friends:每个元素就是一个结构变量,对应:每个元素就是一个结构变量,对应一个联系人一个联系人struct friends_list friends50;2022/10/534第34页,此课件共77页哦程序解析全局变量程序解析全局变量/函数参数函数参数全局变量全局变量Count:记录当前的联系人总数:记录当前的联系人总数 函数函数new_friend和和search_friend的参数之一是结构数组:的参数之一是结构数组:v
27、oid new_friend(struct friends_list friends );void search_friend(struct friends_list friends,char*name);结构数组名作为函数实参与普通数组名作函数参数一样,将结构数组名作为函数实参与普通数组名作函数参数一样,将数组首地址传递给函数形参数组首地址传递给函数形参2022/10/535第35页,此课件共77页哦程序解析源程序程序解析源程序#include#include/*手机通讯录结构定义手机通讯录结构定义*/struct friends_list char name10;/*姓名姓名*/int a
28、ge;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;int Count=0;/*全局变量记录当前联系人总数全局变量记录当前联系人总数*/void new_friend(struct friends_list friends );void search_friend(struct friends_list friends,char*name);2022/10/536第36页,此课件共77页哦源程序源程序int main(void)int choice;char name10;struct friends_list friends50;/*包含包含50个人的通讯录个人
29、的通讯录*/do printf(手机通讯录功能选项:手机通讯录功能选项:1:新建新建 2:查询查询 0:退出退出n);printf(请选择功能:请选择功能:);scanf(%d,&choice);switch(choice)case 1:new_friend(friends);break;case 2:printf(请输入要查找的联系人名请输入要查找的联系人名:);scanf(%s,name);search_friend(friends,name);break;case 0:break;while(choice!=0);printf(谢谢使用通讯录功能谢谢使用通讯录功能!n);return 0
30、;2022/10/537第37页,此课件共77页哦源程序源程序/*新建联系人新建联系人*/void new_friend(struct friends_list friends)struct friends_list f;if(Count=50)printf(通讯录已满通讯录已满!n);return;printf(请输入新联系人的姓名请输入新联系人的姓名:);scanf(%s,f.name);printf(请输入新联系人的年龄请输入新联系人的年龄:);scanf(%d,&f.age);printf(请输入新联系人的联系电话请输入新联系人的联系电话:);scanf(%s,f.telephone)
31、;friendsCount=f;Count+;2022/10/538第38页,此课件共77页哦源程序源程序/*查询联系人查询联系人*/void search_friend(struct friends_list friends,char*name)int i,flag=0;if(Count=0)printf(通讯录是空的通讯录是空的!n);return;for(i=0;i Count;i+)if(strcmp(name,friendsi.name)=0)/*找到联系人找到联系人*/flag=1;break;if(flag)printf(姓名姓名:%st,friendsi.name);print
32、f(年龄年龄:%dt,friendsi.age);printf(电话电话:%sn,friendsi.telephone);else printf(无此联系人无此联系人!);2022/10/539第39页,此课件共77页哦 9.4 共用体共用体(联合体联合体)一、一、共用体的概念共用体的概念 二二个个以以上上不不同同类类型型的的变变量量采采用用“覆覆盖盖技技术术”占占用用同同一一段段内内存单元的结构称为共用体。存单元的结构称为共用体。共用体类型变量的定义形式如下:共用体类型变量的定义形式如下:union 共用体名共用体名 分量表分量表 变量表;变量表;2022/10/540第40页,此课件共77
33、页哦说明说明:虽然:虽然“共用体共用体”与与“结构体结构体”的定义形式相似,但是:的定义形式相似,但是:一个一个结构体变量所需的存储容量结构体变量所需的存储容量为每个为每个分量分量所需存储容量所需存储容量之和之和。而一个而一个共用体变量共用体变量所需的存储容量为各个分量中占用存储容量所需的存储容量为各个分量中占用存储容量最多的分量所需的存储容量最多的分量所需的存储容量。一个一个结构体变量结构体变量的各个分量在任何时刻都的各个分量在任何时刻都同时存在同时存在,且可同时,且可同时引用。而一个共用体变量的引用。而一个共用体变量的各个分量各个分量在同一时刻在同一时刻只存在其中一只存在其中一个个,也只能
34、引用其中的一个分量。即起作用的只是最后一次存放的,也只能引用其中的一个分量。即起作用的只是最后一次存放的分量,在存入一个新的分量后,原有分量的值被覆盖而失去作用。分量,在存入一个新的分量后,原有分量的值被覆盖而失去作用。一个结构体变量的各个分量的一个结构体变量的各个分量的(起始起始)地址各不相同地址各不相同,分别拥有各分别拥有各自的存储空间。而一个共用体变量的各个分量的自的存储空间。而一个共用体变量的各个分量的地址地址(起始起始)相同相同,共同拥有同一存储空间。共同拥有同一存储空间。2022/10/541第41页,此课件共77页哦 共用体类型可以出现在结构体类型定义中,也可以定义共用体类型可以
35、出现在结构体类型定义中,也可以定义共用体类型数组,数组也可以作为共用体的分量。同样,共用体类型数组,数组也可以作为共用体的分量。同样,结构体类型也可以出现在共用体类型定义中。结构体类型也可以出现在共用体类型定义中。不能不能在定义共用体变量时对其在定义共用体变量时对其初始化初始化,也不能对共用体变,也不能对共用体变量名赋值,更不能企图引用共用体变量名去得到分量的值。量名赋值,更不能企图引用共用体变量名去得到分量的值。共用体变量可作为参数传递给函数,也可以作函数的返回值。共用体变量可作为参数传递给函数,也可以作函数的返回值。同样,可以使用地址传送方式将共用体变量的地址作为参数或返回同样,可以使用地
36、址传送方式将共用体变量的地址作为参数或返回值在函数间传递。值在函数间传递。2022/10/542第42页,此课件共77页哦9.4A,9.4A,共用体变量的存储形式共用体变量的存储形式struct memb float v;int n;char c;stag;stag占内存7个字节的空间union memb float v;int n;char c;ustag;ustag占的内存空间为4个字节100110051007vnc2001vnc200220032004 共用体类型变量每次只能存放一个成员的值2022/10/543第43页,此课件共77页哦二、二、共用体变量的引用共用体变量的引用 不能引用
37、共用体变量,只能采用分量运算符不能引用共用体变量,只能采用分量运算符“”引用共用体变量的分量。与引用结构体变量的引用共用体变量的分量。与引用结构体变量的方法是一致的。方法是一致的。2022/10/544第44页,此课件共77页哦例例9.4a9.4a下述程序的输出结果是(下述程序的输出结果是(9 9)。)。(演示演示9-4a.c)9-4a.c)#include#include void main()void main()union union char c;char c;unsigned int i4;unsigned int i4;z;z;z.i0=0 x39;z.i0=0 x39;z.i1=
38、0 x36;z.i1=0 x36;printf(printf(“%c%c”,z.c);,z.c);c ;i0 c ;i0底底8 8位位0 x390 x39 i0 i0高高8 8位位0 x000 x00 i1 0 x36 i1 0 x36 0 x00 0 x00 i2 i2 i4 i42022/10/545第45页,此课件共77页哦 所谓所谓“枚举枚举”是指变量的取值只限于所列举出来的值的范围内。是指变量的取值只限于所列举出来的值的范围内。枚举的定义枚举类型定义的一般形式为:枚举的定义枚举类型定义的一般形式为:enum 枚举名枚举名 枚举值表枚举值表;在枚举值表中应罗列出所有可用值。这些值也称为
39、在枚举值表中应罗列出所有可用值。这些值也称为枚举元素枚举元素。如:如:enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday sun,mon,tue,wed,thu,fri,sat;该枚举名为该枚举名为weekday,枚举值共有,枚举值共有7个,即一周中的七天。凡被说明为个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。类型变量的取值只能是七天中的某一天。9.5 枚举类型枚举类型2022/10/546第46页,此课件共77页哦枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说如同结构和联合一样,枚举变
40、量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。明,即先定义后说明,同时定义说明或直接说明。设有变量设有变量a,b,c被说明为上述的被说明为上述的weekday,可采用下述任,可采用下述任一种方式:一种方式:enum weekday sun,mou,tue,wed,thu,fri,sat;enum weekday a,b,c;或者为:或者为:enum weekday sun,mou,tue,wed,thu,fri,sat a,b,c;或者为:或者为:enum sun,mou,tue,wed,thu,fri,sat a,b,c;2022/10/547第47页,此课件共77页哦 1
41、、枚枚举举元元素素本本身身由由系系统统定定义义了了一一个个表表示示序序号号的的数数值值,从从0开开始始顺顺序序定定义义为为0,1,2。如如在在weekday中中,sun值值为为0,mon值值为为1,,sat值值为为6。2、只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:a=sum;b=mon;是正确的。而:是正确的。而:a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。如:是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。如:a=(enum weekday)2;其意义是将顺序号为其
42、意义是将顺序号为2的枚举元素赋予枚举变量的枚举元素赋予枚举变量a,相当于:,相当于:a=tue;2022/10/548第48页,此课件共77页哦 3、可用如下定义改变枚举元素中的序号值:可用如下定义改变枚举元素中的序号值:enum weekday sun,mon,tue,wed,thu=7,fri,sat;则枚举元素的序号值依次为:则枚举元素的序号值依次为:0、1、2、3、7、8、9。4、还应该说明的是枚举元素不是字符常量也不是字符串常、还应该说明的是枚举元素不是字符常量也不是字符串常量,量,使用时不要加单、双引号使用时不要加单、双引号。2022/10/549第49页,此课件共77页哦/*9_
43、7.c 枚举类型的用法*/#include enum monthsJAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC;main()enum months month;char*monthName=,January,February,March,April,May,June,July,Auguest,September,October,November,Dcember;for(month=JAN;month=DEC;month+)printf(%2d-%-10sn,month,monthNamemonth);2022/10/550第50页,此课件共
44、77页哦9.6 动态数据结构动态数据结构 静态数据结构静态数据结构(例如数组例如数组)占据内存空间的位置和大小是在它占据内存空间的位置和大小是在它们被说明的同时由系统分配的们被说明的同时由系统分配的,在程序运行期间是不变的在程序运行期间是不变的,因因此可以有效地访问它们的任何一个元素。但要删除和插入一个此可以有效地访问它们的任何一个元素。但要删除和插入一个元素则比较困难元素则比较困难,往往要引起大量的数据移动。往往要引起大量的数据移动。而且数据量的而且数据量的扩充更受到它们所占用的有限内存空间的限制。扩充更受到它们所占用的有限内存空间的限制。C中的动态数中的动态数据结构有效地解决了这一问题。动
45、态数据结构中的每个组成数据据结构有效地解决了这一问题。动态数据结构中的每个组成数据在逻辑上是连续排列的,但在物理上即在内存中存储时并不占用在逻辑上是连续排列的,但在物理上即在内存中存储时并不占用连续的内存空间,它们可以根据需要随机地增加或减少其元素连续的内存空间,它们可以根据需要随机地增加或减少其元素,相应地占用或释放内存空间。相应地占用或释放内存空间。动态数据结构中最基本的形式是动态数据结构中最基本的形式是链表链表和二叉树和二叉树,它们在数据它们在数据处理中起着十分重要的作用。处理中起着十分重要的作用。2022/10/551第51页,此课件共77页哦一、一、动态存储分配动态存储分配C语言实现
46、动态存储分配的函数:语言实现动态存储分配的函数:(类型说明符类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。字节的连续区域。函数的返回值为该区域的首地址。函数的返回值为该区域的首地址。“类型说明符类型说明符”表示把该区域用于何种数据类型。表示把该区域用于何种数据类型。(类型说明符类型说明符*)表示把返回值强制转换为该类型指针。表示把返回值强制转换为该类型指针。“size”是一个无符号数。是一个无符号数。例如:例如:pc=(char*)malloc(100);表示分配表示分配100个字节的内存空间,
47、并强制转换为字符数组类型,函数个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。2022/10/552第52页,此课件共77页哦 (类型说明符类型说明符*)calloc(n,size)在内存动态存储区中分配在内存动态存储区中分配n块长度为块长度为“size”字节的连续区域。函数的字节的连续区域。函数的返回值为该区域的首地址。返回值为该区域的首地址。calloc函数与函数与malloc 函数的区别仅在于一次可以分配函数的区别仅在于一次可以分配n块区域。块区域。例如:例如:ps=(struc
48、t stu*)calloc(2,sizeof(struct stu);free(ptr)释放由释放由指针指针ptr所指向的存储空间。所指向的存储空间。ptr是最近一次调是最近一次调用用malloc或或calloc函数或链表指针返回的值。函数或链表指针返回的值。ptr为字符型指为字符型指针。针。2022/10/553第53页,此课件共77页哦二、二、链表链表 链表概念链表概念 链表是一种常见的动态地进行存储分配的数据结构。链链表是一种常见的动态地进行存储分配的数据结构。链表有表有“单向链表单向链表”、“双向链表双向链表”、“循环链表循环链表”、“双向双向循环链表循环链表”之分。下图是一个之分。下
49、图是一个“单向链表单向链表”的示例。的示例。单向链表是按照输入数据的顺序建立的。它有一个单向链表是按照输入数据的顺序建立的。它有一个“头头指针指针”(图中为图中为head),指向第一个元素;每一个元素称为,指向第一个元素;每一个元素称为“结点结点”,每个结点包括两个域:,每个结点包括两个域:数据域数据域和指向下一个结点的和指向下一个结点的指针域指针域;最后一个元素的指针域为;最后一个元素的指针域为“NULL”(“空地址空地址”),表,表示链表的结束,称为示链表的结束,称为“表尾表尾”。2022/10/554第54页,此课件共77页哦a1a2ana3L.线性表的链式存储结构可用线性表的链式存储结
50、构可用C语言中的语言中的“结构指针结构指针”来描述来描述单向链表存储结构单向链表存储结构带头结点的线性链表带头结点的线性链表datanextstruct jd int data;Struct jd*next;2022/10/555第55页,此课件共77页哦步骤步骤:1 1、定义链表接点数据类型;、定义链表接点数据类型;2 2、建立表头、建立表头(亦即建立一个空表亦即建立一个空表);3 3、利用、利用malloc()malloc()申请分配申请分配一个节点一个节点空间;空间;4 4、将新节点的指针成员的值赋为空、将新节点的指针成员的值赋为空,若是空表若是空表,将新节将新节点连接到表头点连接到表头