《构造数据类型精选文档.ppt》由会员分享,可在线阅读,更多相关《构造数据类型精选文档.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、构造数据类型2022/10/251本讲稿第一页,共七十七页9.1 结构体数据类型结构体数据类型 前面介绍的变量都只包含一种类型前面介绍的变量都只包含一种类型,但在实际问题,但在实际问题中,常常要求把一些属于不同类型的数据作为一个整体中,常常要求把一些属于不同类型的数据作为一个整体来处理。来处理。如:一个职员的编号、姓名、年龄、性别、身份证号码、如:一个职员的编号、姓名、年龄、性别、身份证号码、民族、文化程度、职务、住址、联系电话等等。民族、文化程度、职务、住址、联系电话等等。由一些不同类型的数据组合而成的数据整体,由一些不同类型的数据组合而成的数据整体,C语言语言称之为称之为“结构体结构体”类
2、型类型,结构体中所包含的数据元素称之为,结构体中所包含的数据元素称之为成员成员。2022/10/252本讲稿第二页,共七十七页9.1.2 结构的概念与定义使用结构来表示通讯录信息:struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;结构:结构:构造数据类型构造数据类型,把有内在联系的,把有内在联系的不同类型的数不同类型的数据据统一成一个整体,使它们相互关联统一成一个整体,使它们相互关联结构又是变量的集合,可以单独使用其成员结构又是变量的集合,可以单独使用其成员2022/10/
3、253本讲稿第三页,共七十七页结构的定义结构类型定义的一般形式为:结构类型定义的一般形式为:struct 结构名结构名 类型名类型名 结构成员名结构成员名1;类型名类型名 结构成员名结构成员名2;类型名类型名 结构成员名结构成员名n;;结构的定义以分号结束,结构的定义以分号结束,被看作一条语句被看作一条语句 关键字关键字struct和它后面的和它后面的结构名一起组成一个新的结构名一起组成一个新的数据类型名数据类型名 2022/10/254本讲稿第四页,共七十七页结构体类型的特点:结构体类型的特点:结构体名为任何合法的标识符,建议用具有结构体名为任何合法的标识符,建议用具有一定意义的单词或组合作
4、为结构体名。一定意义的单词或组合作为结构体名。虽然成员的类型定义形式同简单变量,但虽然成员的类型定义形式同简单变量,但不不能直接使用能直接使用。定义结构体类型只是定义结构体类型只是定义类型定义类型而不是定义变而不是定义变量。量。2022/10/255本讲稿第五页,共七十七页结构定义示例定义平面坐标结构:struct point double x;double y;虽然x、y的类型相同,也可以用数组的方式表示,但采用结构体描述整体性更强,增加了程序的可读性,使程序更清晰。2022/10/256本讲稿第六页,共七十七页9.1.3 结构的嵌套定义在实际生活中,一个较大的实体可能由多个成员构成,而这些
5、成员中有些又有可能是由一些更小的成员构成的实体。在手机通讯录中,增加“通信地址”姓名性别年龄 通信地址联系电话电子邮箱城市街道门牌号邮编2022/10/257本讲稿第七页,共七十七页结构的嵌套定义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/258本讲稿第八页,共七十七页9.2 结构变量 9.2.1 结构变量的定义和初始化结构变量的定义和初始化9.2.2 结构变量的使用结构变量的使用2022/10/259本讲稿第九页,共七十七页9.2.1结构变量的定义和初始化三种定义结构变量的方式:1.单独定义单独定义先定义结构类型结构类型,再定义具有这种结构类型的变量 struct friends_list char name10;/*姓名*/int age;/*年龄*/char telephone13;/*联系电话*/;struct fr
7、iends_list friend1,friend2;2022/10/2510本讲稿第十页,共七十七页结构变量的定义2.混合定义混合定义在定义结构体类型的同时定义结构体变量 struct friends_listchar name10;int age;char telephone13;friend1,friend2;3.无类型名定义无类型名定义在定义结构体变量时省略结构体名struct char name10;int age;char telephone13;friend1,friend2;2022/10/2511本讲稿第十一页,共七十七页结构变量的初始化 struct friends_lis
8、t friend1=Zhang,26,0571-85171880 ;name age telephone Zhang260571-852718802022/10/2512本讲稿第十二页,共七十七页9.2.2 结构变量的使用1.结构变量成员的引用结构变量名结构变量名.结构成员名结构成员名friend1.age=26;strcpy(friend1.name,Zhang San);nest_friend.addr.zip2022/10/2513本讲稿第十三页,共七十七页2、将结构体变量作为一个整体来使用。、将结构体变量作为一个整体来使用。可以将一个结构体变量作为一个整体赋给另一个结构体变可以将一个结
9、构体变量作为一个整体赋给另一个结构体变量,条件是这两个变量必须量,条件是这两个变量必须具有相同的结构体类型具有相同的结构体类型。例如:例如:struct friend_list doctor=“Li Ming”,24,88753540;struct friend_list teacher;teacher=doctor;/*将结构体变量将结构体变量doctor的值赋给的值赋给teacher*/这样,变量这样,变量teacher中各成员的值均与中各成员的值均与doctor 的成员的值相同。的成员的值相同。2022/10/2514本讲稿第十四页,共七十七页【例例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/2515本讲稿第十五页,共七十七页main()struct stu student1=Li Ming,M,990324,88,80,90;struct stu student2;student2=student1;student2.name0=H
11、;student2.name1=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);
12、程序运行结果程序运行结果:Record1-Li Ming,M,990324,88,80,90Record1-Hu Ming,M,990325,83,80,90 2022/10/2516本讲稿第十六页,共七十七页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/2517本讲稿第十七页,共七十七页9.2 结构体数组结构体数组 结构体数组结构体数组,亦即数组中每一个元素都是一个,亦即数组中每一个元素都是一个结构体变量。结构体变量。9.2.1 结构体数组的定义结构体数组的定义 结构体数组的定义方法与结构体变量的定义方法相同。结构体数组的定义方法与结构体变量的定义方
14、法相同。一、一、先先定义定义结构体结构体,再再定义结构体定义结构体数组数组:struct ;struct ;2022/10/2518本讲稿第十八页,共七十七页二、在定义结构体的二、在定义结构体的同时同时,定义结构体数组:,定义结构体数组:struct ;三、直接定义结构体变量而不定义结构体名;三、直接定义结构体变量而不定义结构体名;struct ;2022/10/2519本讲稿第十九页,共七十七页9.2.2 结构体数组成员的初始化和引用结构体数组成员的初始化和引用 结构体数组成员的值也可以初始化,初始化结构体数组成员的值也可以初始化,初始化的形式与的形式与二维数组二维数组的初始化形式类似。的初
15、始化形式类似。例如:例如:struct student stu30=“LiFei”,“DongFeng Road 14”,430038,“LiMing”,“zhongshan Road 378”,430082,“LiYong”,“Xiao Shan Road 25”,430001;2022/10/2520本讲稿第二十页,共七十七页 结构体数组的引用完全类似于结构体变量的引用,只结构体数组的引用完全类似于结构体变量的引用,只是用是用结构体数组元素结构体数组元素来代替来代替结构体变量结构体变量,其他规则不变,其他规则不变,如下面所示:如下面所示:*/引用某一元素的成员引用某一元素的成员 */stu
16、0.namestu0.agestu0=stu2;*/将结构体数组元素作为一个整体来使将结构体数组元素作为一个整体来使用用*/2022/10/2521本讲稿第二十一页,共七十七页9.3 结构体变量与函数结构体变量与函数 一、函数的形参与实参为结构型一、函数的形参与实参为结构型【例例9-2】下面的程序是计算四种书的购书情况,并输出统计下面的程序是计算四种书的购书情况,并输出统计结果。结果。分析分析,定义一个结构体类型定义一个结构体类型BookLib,用来描述购书的信息用来描述购书的信息,还定义了一个函数还定义了一个函数list,它的参数为结构型变量它的参数为结构型变量,函数的作函数的作用是计算购书
17、的总费用并输出所有信息。用是计算购书的总费用并输出所有信息。在主程序中,定义了一个临时字符数组变量在主程序中,定义了一个临时字符数组变量temp15,用于将,用于将用户输入的两个数值:一个是书的数目用户输入的两个数值:一个是书的数目num,另一个是书,另一个是书的价格的价格price作为字符串来接收,然后通过作为字符串来接收,然后通过atoi()函数和函数和atof()函数将函数将temp转成整型值和实型值。转成整型值和实型值。2022/10/2522本讲稿第二十二页,共七十七页/*exam9_2.c 函数的参数为结构类型函数的参数为结构类型*/#include#include#include
18、 struct BookLib char name12;int num;float price;float SumMoney;2022/10/2523本讲稿第二十三页,共七十七页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(tem
19、p);Booki.price=atof(temp);2022/10/2524本讲稿第二十四页,共七十七页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/2525本讲稿第二十
20、五页,共七十七页程序运行结果程序运行结果:Please 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/2526本讲稿第二十六页,共七十七页-name
21、num price SumMoneyComputer 300 18.60 5580.00Mathematics 600 15.50 9300.00English 360 22.80 8208.00Chemistry 150 14.20 2130.002022/10/2527本讲稿第二十七页,共七十七页二、函数的返回值类型为结构型二、函数的返回值类型为结构型 C标准中还允许函数的返回值为结构体类型的值。标准中还允许函数的返回值为结构体类型的值。【例例9-3】把上面这个程序例子稍作修改,将数据输入用一个把上面这个程序例子稍作修改,将数据输入用一个函数函数NewBook()来实现。来实现。/*exa
22、m9_3.c 函数的返回值为结构类型函数的返回值为结构类型*/#include#include#include 2022/10/2528本讲稿第二十八页,共七十七页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.SumMone
23、y);2022/10/2529本讲稿第二十九页,共七十七页struct 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/2530本讲稿第三十页,共七十七页main()struct BookLib Book4;int i;for(i=0;i4;
24、i+)Booki=NewBook();printf(-n);printf(name num price SumMoneyn);for(i=0;i4;i+)list(Booki);程序中定义了两个函数:无返回值的函数程序中定义了两个函数:无返回值的函数list(),返回值为,返回值为结构体类型变量的函数结构体类型变量的函数NewBook()用来给结构体变量数组赋用来给结构体变量数组赋值。值。2022/10/2531本讲稿第三十一页,共七十七页例例9-4 构建简单的手机通讯录构建简单的手机通讯录联系人的基本信息:姓名、年龄和联系电话联系人的基本信息:姓名、年龄和联系电话最多容纳最多容纳50名联系人
25、的信息名联系人的信息 具有新建和查询功能具有新建和查询功能2022/10/2532本讲稿第三十二页,共七十七页程序解析程序结构程序结构程序结构主函数主函数main:程序的总体控制:程序的总体控制函数函数new_friend:新建联系人功能:新建联系人功能函数函数search_friend:查询联系人功能:查询联系人功能 main()new_friend()search_friend()2022/10/2533本讲稿第三十三页,共七十七页程序解析数据类型程序解析数据类型/变量变量数据类型数据类型/变量变量结构类型结构类型struct friends_list:在程序首部定义,其:在程序首部定义,
26、其中的成员分别代表联系人的基本信息中的成员分别代表联系人的基本信息struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;结构数组结构数组friends:每个元素就是一个结构变量,对:每个元素就是一个结构变量,对应一个联系人应一个联系人struct friends_list friends50;2022/10/2534本讲稿第三十四页,共七十七页程序解析全局变量程序解析全局变量/函数参数函数参数全局变量全局变量Count:记录当前的联系人总数:记录当前的联系人总数 函数函数new
27、_friend和和search_friend的参数之一是结构数组:的参数之一是结构数组:void new_friend(struct friends_list friends );void search_friend(struct friends_list friends,char*name);结构数组名作为函数实参与普通数组名作函数参数一样,将数组首结构数组名作为函数实参与普通数组名作函数参数一样,将数组首地址传递给函数形参地址传递给函数形参2022/10/2535本讲稿第三十五页,共七十七页程序解析源程序程序解析源程序#include#include/*手机通讯录结构定义手机通讯录结构定义
28、*/struct friends_list char name10;/*姓名姓名*/int age;/*年龄年龄*/char telephone13;/*联系电话联系电话*/;int Count=0;/*全局变量记录当前联系人总数全局变量记录当前联系人总数*/void new_friend(struct friends_list friends );void search_friend(struct friends_list friends,char*name);2022/10/2536本讲稿第三十六页,共七十七页源程序源程序int main(void)int choice;char name
29、10;struct friends_list friends50;/*包含包含50个人的通讯录个人的通讯录*/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
30、(choice!=0);printf(谢谢使用通讯录功能谢谢使用通讯录功能!n);return 0;2022/10/2537本讲稿第三十七页,共七十七页源程序源程序/*新建联系人新建联系人*/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);prin
31、tf(请输入新联系人的联系电话请输入新联系人的联系电话:);scanf(%s,f.telephone);friendsCount=f;Count+;2022/10/2538本讲稿第三十八页,共七十七页源程序源程序/*查询联系人查询联系人*/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
32、=1;break;if(flag)printf(姓名姓名:%st,friendsi.name);printf(年龄年龄:%dt,friendsi.age);printf(电话电话:%sn,friendsi.telephone);else printf(无此联系人无此联系人!);2022/10/2539本讲稿第三十九页,共七十七页 9.4 共用体共用体(联合体联合体)一、一、共用体的概念共用体的概念 二二个个以以上上不不同同类类型型的的变变量量采采用用“覆覆盖盖技技术术”占占用用同同一一段段内存单元的结构称为共用体。内存单元的结构称为共用体。共用体类型变量的定义形式如下:共用体类型变量的定义形式
33、如下:union 共用体名共用体名 分量表分量表 变量表;变量表;2022/10/2540本讲稿第四十页,共七十七页说明说明:虽然:虽然“共用体共用体”与与“结构体结构体”的定义形式相似,但是:的定义形式相似,但是:一个一个结构体变量所需的存储容量结构体变量所需的存储容量为每个为每个分量分量所需存储容量所需存储容量之之和和。而一个。而一个共用体变量共用体变量所需的存储容量为各个分量中占用存储容所需的存储容量为各个分量中占用存储容量量最多的分量所需的存储容量最多的分量所需的存储容量。一个一个结构体变量结构体变量的各个分量在任何时刻都的各个分量在任何时刻都同时存在同时存在,且可同时,且可同时引用。
34、而一个共用体变量的引用。而一个共用体变量的各个分量各个分量在同一时刻在同一时刻只存在其中一个只存在其中一个,也只能引用其中的一个分量。即起作用的只是最后一次存放的分量,也只能引用其中的一个分量。即起作用的只是最后一次存放的分量,在存入一个新的分量后,原有分量的值被覆盖而失去作用。在存入一个新的分量后,原有分量的值被覆盖而失去作用。一个结构体变量的各个分量的一个结构体变量的各个分量的(起始起始)地址各不相同地址各不相同,分别拥有各分别拥有各自的存储空间。而一个共用体变量的各个分量的自的存储空间。而一个共用体变量的各个分量的地址地址(起始起始)相同相同,共同拥有同一存储空间。共同拥有同一存储空间。
35、2022/10/2541本讲稿第四十一页,共七十七页 共用体类型可以出现在结构体类型定义中,也可以定义共共用体类型可以出现在结构体类型定义中,也可以定义共用体类型数组,数组也可以作为共用体的分量。同样,结构体用体类型数组,数组也可以作为共用体的分量。同样,结构体类型也可以出现在共用体类型定义中。类型也可以出现在共用体类型定义中。不能不能在定义共用体变量时对其在定义共用体变量时对其初始化初始化,也不能对共用体变,也不能对共用体变量名赋值,更不能企图引用共用体变量名去得到分量的值。量名赋值,更不能企图引用共用体变量名去得到分量的值。共用体变量可作为参数传递给函数,也可以作函数的返回值。共用体变量可
36、作为参数传递给函数,也可以作函数的返回值。同样,可以使用地址传送方式将共用体变量的地址作为参数或同样,可以使用地址传送方式将共用体变量的地址作为参数或返回值在函数间传递。返回值在函数间传递。2022/10/2542本讲稿第四十二页,共七十七页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 共用体类型变量每
37、次只能存放一个成员的值2022/10/2543本讲稿第四十三页,共七十七页二、二、共用体变量的引用共用体变量的引用 不能引用共用体变量,只能采用分量运算符不能引用共用体变量,只能采用分量运算符“”引用共用体变量的分量。与引用结构体变量的方引用共用体变量的分量。与引用结构体变量的方法是一致的。法是一致的。2022/10/2544本讲稿第四十四页,共七十七页例例9.4a9.4a下述程序的输出结果是(下述程序的输出结果是(9 9)。)。(演示演示9-4a.c)9-4a.c)#include#include void main()void main()union union char c;char c
38、;unsigned int i4;unsigned int i4;z;z;z.i0=0 x39;z.i0=0 x39;z.i1=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/2545本讲稿第四十五页,共七十七页 所谓所谓“枚举枚举”是指变量的取值只限于所列举出来的值的范围内。是指变量的取值只限于所列举出来的值的范围内。枚举的定义枚举类型定义的一
39、般形式为:枚举的定义枚举类型定义的一般形式为:enum 枚举名枚举名 枚举值表枚举值表;在枚举值表中应罗列出所有可用值。这些值也称为在枚举值表中应罗列出所有可用值。这些值也称为枚举元素枚举元素。如:如:enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday sun,mon,tue,wed,thu,fri,sat;该枚举名为该枚举名为weekday,枚举值共有,枚举值共有7个,即一周中的七天。凡被说明为个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。类型变量的取值只能是七天中的某一天。9.5 枚举类型枚举类型20
40、22/10/2546本讲稿第四十六页,共七十七页枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。式说明,即先定义后说明,同时定义说明或直接说明。设有变量设有变量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;或者为:或
41、者为:enum sun,mou,tue,wed,thu,fri,sat a,b,c;2022/10/2547本讲稿第四十七页,共七十七页 1、枚枚举举元元素素本本身身由由系系统统定定义义了了一一个个表表示示序序号号的的数数值值,从从0开开始始顺顺序序定定义义为为0,1,2。如如在在weekday中中,sun值值为为0,mon值值为为1,,sat值为值为6。2、只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如量。如:a=sum;b=mon;是正确的。而:是正确的。而:a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须
42、用强制类型转换。如:是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。如:a=(enum weekday)2;其意义是将顺序号为其意义是将顺序号为2的枚举元素赋予枚举变量的枚举元素赋予枚举变量a,相当于:,相当于:a=tue;2022/10/2548本讲稿第四十八页,共七十七页 3、可用如下定义改变枚举元素中的序号值:可用如下定义改变枚举元素中的序号值:enum weekday sun,mon,tue,wed,thu=7,fri,sat;则枚举元素的序号值依次为:则枚举元素的序号值依次为:0、1、2、3、7、8、9。4、还应该说明的是枚举元素不是字符常量也不是字符串、还应该说明的是枚
43、举元素不是字符常量也不是字符串常量,常量,使用时不要加单、双引号使用时不要加单、双引号。2022/10/2549本讲稿第四十九页,共七十七页/*9_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;mon
44、th=DEC;month+)printf(%2d-%-10sn,month,monthNamemonth);2022/10/2550本讲稿第五十页,共七十七页9.6 动态数据结构动态数据结构 静态数据结构静态数据结构(例如数组例如数组)占据内存空间的位置和大小是在占据内存空间的位置和大小是在它们被说明的同时由系统分配的它们被说明的同时由系统分配的,在程序运行期间是不变的在程序运行期间是不变的,因此可以有效地访问它们的任何一个元素。但要删除和插因此可以有效地访问它们的任何一个元素。但要删除和插入一个元素则比较困难入一个元素则比较困难,往往要引起大量的数据移动。往往要引起大量的数据移动。而且而且数
45、据量的扩充更受到它们所占用的有限内存空间的限制。数据量的扩充更受到它们所占用的有限内存空间的限制。C中的中的动态数据结构有效地解决了这一问题。动态数据结构中的每个动态数据结构有效地解决了这一问题。动态数据结构中的每个组成数据在逻辑上是连续排列的,但在物理上即在内存中存储组成数据在逻辑上是连续排列的,但在物理上即在内存中存储时并不占用连续的内存空间,它们可以根据需要随机地增加或时并不占用连续的内存空间,它们可以根据需要随机地增加或减少其元素减少其元素,相应地占用或释放内存空间。相应地占用或释放内存空间。动态数据结构中最基本的形式是动态数据结构中最基本的形式是链表链表和二叉树和二叉树,它们在它们在
46、数据处理中起着十分重要的作用。数据处理中起着十分重要的作用。2022/10/2551本讲稿第五十一页,共七十七页一、一、动态存储分配动态存储分配C语言实现动态存储分配的函数:语言实现动态存储分配的函数:(类型说明符类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函字节的连续区域。函数的返回值为该区域的首地址。数的返回值为该区域的首地址。“类型说明符类型说明符”表示把该区域用于何种数据类型。表示把该区域用于何种数据类型。(类型说明符类型说明符*)表示把返回值强制转换为该类型指针。表示把返回值强制转换
47、为该类型指针。“size”是一个无符号数。是一个无符号数。例如:例如:pc=(char*)malloc(100);表示分配表示分配100个字节的内存空间,并强制转换为字符数组类型,函数个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。2022/10/2552本讲稿第五十二页,共七十七页 (类型说明符类型说明符*)calloc(n,size)在内存动态存储区中分配在内存动态存储区中分配n块长度为块长度为“size”字节的连续区域。函字节的连续区域。函数的返回值为该区域的首地址。数的返回值为
48、该区域的首地址。calloc函数与函数与malloc 函数的区别仅在于一次可以分配函数的区别仅在于一次可以分配n块区域。块区域。例如:例如:ps=(struct stu*)calloc(2,sizeof(struct stu);free(ptr)释放由释放由指针指针ptr所指向的存储空间。所指向的存储空间。ptr是最近一次调是最近一次调用用malloc或或calloc函数或链表指针返回的值。函数或链表指针返回的值。ptr为字符型为字符型指针。指针。2022/10/2553本讲稿第五十三页,共七十七页二、二、链表链表 链表概念链表概念 链表是一种常见的动态地进行存储分配的数据结构。链表是一种常见
49、的动态地进行存储分配的数据结构。链表有链表有“单向链表单向链表”、“双向链表双向链表”、“循环链表循环链表”、“双向循环链表双向循环链表”之分。下图是一个之分。下图是一个“单向链表单向链表”的示例。的示例。单向链表是按照输入数据的顺序建立的。它有一个单向链表是按照输入数据的顺序建立的。它有一个“头指针头指针”(图中为图中为head),指向第一个元素;每一个元素称,指向第一个元素;每一个元素称为为“结点结点”,每个结点包括两个域:,每个结点包括两个域:数据域数据域和指向下一个和指向下一个结点的结点的指针域指针域;最后一个元素的指针域为;最后一个元素的指针域为“NULL”(“空地空地址址”),表示
50、链表的结束,称为,表示链表的结束,称为“表尾表尾”。2022/10/2554本讲稿第五十四页,共七十七页a1a2ana3L.线性表的链式存储结构可用线性表的链式存储结构可用C语言中的语言中的“结构指针结构指针”来描述来描述单向链表存储结构单向链表存储结构带头结点的线性链表带头结点的线性链表datanextstruct jd int data;Struct jd*next;2022/10/2555本讲稿第五十五页,共七十七页步骤步骤:1 1、定义链表接点数据类型;、定义链表接点数据类型;2 2、建立表头、建立表头(亦即建立一个空表亦即建立一个空表);3 3、利用、利用malloc()malloc