《结构体共用体链表.ppt》由会员分享,可在线阅读,更多相关《结构体共用体链表.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第十四章十四章BettyBetty 总目录总目录 下一章下一章结构体、公用体、链表基本操作 14.1 结构体的定义及引用 14.2 结构体数组 14.3 结构体与指针 14.4链表的概念 14.5 共用体的概念 14.6 类型标识符的自定义第一节第一节 结构体结构体14.1.1 14.1.1 结构体类型标识符的定义结构体类型标识符的定义 14.1.2 14.1.2 结构体类型变量的定义结构体类型变量的定义14.1.3 14.1.3 结构体变量的使用结构体变量的使用 在一个组合项中包含若干个不同的数据项。称为结构体structure。它相当于其他高级语言中的记录。14.1.1 结构体类型标识符
2、的定义结构体类型标识符的定义学号姓名性别成绩 所谓结构体的定义结构体的定义,是指定义相应的数据结构及相应的变量。先定义一个结构体类型标识符先定义一个结构体类型标识符 再定义相应的变量再定义相应的变量例如:要求定义关于学生通讯录的结构体类型struct_name1,其中包括以下数据:学号(整型)、姓名(长度为10的字符数组)、性别(字符型)、年龄(整型)、成绩(实型)结构体定义:结构体定义:struct student int num;char name10;char sex;int age;float score;学号 int 姓 名 char name10 性 别char sex 年龄 in
3、t成绩floatstudent关键字关键字自己定义的自己定义的结构体名结构体名数据项数据项(成员)(成员)名称名称结构体描述:结构体描述:定义有定义有n个成员的结构体类型的一般形式:个成员的结构体类型的一般形式:structstruct 结构体类型标识符结构体类型标识符 类型标识符类型标识符1 1成员名成员名1 1;类型标识符类型标识符2 2 成员名成员名2 2;.类型标识符类型标识符n n 成员名成员名n;n;;14.1.2结构体类型变量的定义结构体类型变量的定义定义变量的一般形式:定义变量的一般形式:定义变量的一般形式:定义变量的一般形式:step1:step1:定义好一个结构体类型后定义
4、好一个结构体类型后 step2:step2:定义变量定义变量 structstruct 结构体类型标识符结构体类型标识符结构体类型标识符结构体类型标识符 变量名列表;变量名列表;变量名列表;变量名列表;注:关键字注:关键字struct 与结构体类型标识符一起使用。与结构体类型标识符一起使用。例:例:例:例:structstruct student std1,std2;student std1,std2;关键字关键字关键字关键字 已经定义的结构体类型名已经定义的结构体类型名已经定义的结构体类型名已经定义的结构体类型名 变量变量变量变量还可以用如下方法定义结构体变量还可以用如下方法定义结构体变量:
5、(1)直接定义结构体变量直接定义结构体变量:形形 如如:structstruct 类型标识符类型标识符1 1 成员名成员名1;1;类型标识符类型标识符2 2 成员名成员名2;2;类型标识符类型标识符n n 成员名成员名n;n;变量名表变量名表;例例:structstruct int num;char name10;char sex;int age;float score;std1,std2;(2)在定义结构体类型标识符的同时定义变量在定义结构体类型标识符的同时定义变量形形形形 如如如如:structstruct 结构体类型标识符结构体类型标识符 类型标识符类型标识符1 1 成员名成员名1;1;
6、类型标识符类型标识符2 2 成员名成员名2;2;类型标识符类型标识符n n 成员名成员名n;n;变量名表变量名表;例例:structstruct student student int num;char name10;char sex;int age;float score;std1,std2;14.1.3 14.1.3 结构体变量的使用结构体变量的使用 只有在只有在只有在只有在对结构体变量赋值对结构体变量赋值对结构体变量赋值对结构体变量赋值或或或或作为参数作为参数作为参数作为参数传递给函数传递给函数传递给函数传递给函数等特殊情况下可以直接对一个等特殊情况下可以直接对一个等特殊情况下可以直接对
7、一个等特殊情况下可以直接对一个结构体变量结构体变量结构体变量结构体变量整体整体整体整体操作。操作。操作。操作。其他情况只能对结构体变量的各个其他情况只能对结构体变量的各个其他情况只能对结构体变量的各个其他情况只能对结构体变量的各个成员成员成员成员分别引用。分别引用。分别引用。分别引用。结构体变量名结构体变量名 成员名成员名成员运算符成员运算符成员运算符成员运算符例:定义两个变量 struct stduent std1,std2;引用 std1.name;std2.name;std1.name=“Li Lin”;std2.name=“Liu Qiang”;printf(“%s”,std1.nam
8、e);成员的引用形式为成员的引用形式为成员的引用形式为成员的引用形式为:结构体变量的一般用法结构体变量的一般用法结构体变量的一般用法结构体变量的一般用法:(1)(1)(1)(1)在定义结构体变量的同时在定义结构体变量的同时在定义结构体变量的同时在定义结构体变量的同时,对结构体变量初始化对结构体变量初始化对结构体变量初始化对结构体变量初始化structstruct std std intint num;num;char name8;char name8;float score;float score;student1=10,“student1=10,“宋宋宋宋 红红红红”,89;,89;相当于相
9、当于:student1.num=10;student1.num=10;strcpy(student1.name,“strcpy(student1.name,“宋宋 红红”););student1.score=89;student1.score=89;思考:是否可以写成思考:是否可以写成student1.name=“student1.name=“宋宋 红红”;(2)(2)(2)(2)在某些情况下可以对结构体变量的整体进行操作在某些情况下可以对结构体变量的整体进行操作在某些情况下可以对结构体变量的整体进行操作在某些情况下可以对结构体变量的整体进行操作例如例如:structstruct std st
10、d intint num;num;float score;float score;student1,student2;student1,student2;赋值:赋值:赋值:赋值:student2=student1;student2=student1;相当于相当于:student2.num=student1.num;student2.num=student1.num;student2.score=student1.score;student2.score=student1.score;(3)(3)(3)(3)一般来说一般来说一般来说一般来说,在程序设计中不直接引用结构体变量在程序设计中不直接引用
11、结构体变量在程序设计中不直接引用结构体变量在程序设计中不直接引用结构体变量,而是引用而是引用而是引用而是引用 结构体变量的某个成员变量。结构体变量的某个成员变量。结构体变量的某个成员变量。结构体变量的某个成员变量。又例如:student1.num=2*student2.num+1;student2.num+;sum=student1.score+student2.score;例如例如例如例如 student2=student1;student2=student1;相当于相当于:student2.num=student1.num;student2.num=student1.num;student
12、2.score=student1.score;student2.score=student1.score;例例14.1 14.1 输入某班输入某班3232名学生的学号和考试成绩名学生的学号和考试成绩,求求成绩最好的学生的学号和成绩及平均成绩。成绩最好的学生的学号和成绩及平均成绩。析析:定义结构体定义结构体,包含两个成员包含两个成员:学号和成绩。学号和成绩。main()struct struct_name int num;float score;student,max;int i;float sum;max.score=0;sum=0;变量定义变量定义 结构体变量结构体变量max用来存放成绩最好
13、的用来存放成绩最好的那个学生的信息。那个学生的信息。定义结构体类型定义结构体类型struct_namei 用来控制循环用来控制循环sum用来存放总成绩用来存放总成绩变量初始化变量初始化 for (i=1;imax.score)max=student;sum=sum+student.score;printf(“n%d%f%f”,max.num,max.score,sum);相当于相当于max.num=student.num;max.score=student.score;第二节第二节 结构体数组结构体数组14.2.1 14.2.1 结构体数组的定义结构体数组的定义14.2.2 14.2.2 结构
14、体数组的初始化结构体数组的初始化14.2.3 14.2.3 结构体数组的使用举例结构体数组的使用举例14.2 结构体数组结构体数组数组的每个元素是结构体类型例如例如:定义一个结构体数组变量定义一个结构体数组变量std3,std3,每个元素每个元素包含两个成员:学号、成绩。包含两个成员:学号、成绩。909090039003878790029002898990019001scorescorenumnum数组数组stdstdstd0std0std1std1std2std214.2.1 结构体数组的定义结构体数组的定义()先定义结构体类型标识符,然后用该标识符)先定义结构体类型标识符,然后用该标识符)
15、先定义结构体类型标识符,然后用该标识符)先定义结构体类型标识符,然后用该标识符定义数组。定义数组。定义数组。定义数组。structstruct struct_namestruct_name intint num;num;float score;float score;structstruct struct_namestruct_name std3;std3;(2)直接定义结构体数组:直接定义结构体数组:struct int num;float score;std3;(3)在定义结构体类型标识符的同时在定义结构体类型标识符的同时定义数组定义数组 struct struct_name int nu
16、m;float score;std3;14.2.2 结构体数组的初始化结构体数组的初始化 对结构体数组初始化,即为数对结构体数组初始化,即为数组中的各个元素赋初值。组中的各个元素赋初值。一般形式:structstruct 结构体类型标识符结构体类型标识符 类型标识符类型标识符1 1 成员名成员名1 1;类型标识符类型标识符2 2 成员名成员名2 2;类型标识符类型标识符n n 成员名成员名n;n;结构体数组结构体数组=数组元素数组元素1 1的各个初值的各个初值,数组元素数组元素2 2的各个初值的各个初值,;注意:注意:注意:注意:(1)定义数组的同时为数组初始化时定义数组的同时为数组初始化时,
17、数数组元素的个数可以不指定组元素的个数可以不指定,系统会根据系统会根据初值的个数来确定数组元素的个数。初值的个数来确定数组元素的个数。(2)(2)数组中各个元素的初值用花括号数组中各个元素的初值用花括号括括起来起来,同一同一数组数组元素的各个成员变量的元素的各个成员变量的 初值用逗号分隔。初值用逗号分隔。如如如如:structstruct struct_namestruct_name intint num;num;float score;float score;std=9001,89,9002,87,9003,90;std=9001,89,9002,87,9003,90;系统自动确定数组系统自
18、动确定数组系统自动确定数组系统自动确定数组stdstd共有共有共有共有3 3个元素。个元素。个元素。个元素。每个元素的初值用一对括起来。每个元素的初值用一对括起来。每个元素的初值用一对括起来。每个元素的初值用一对括起来。14.2.3 结构体数组的应用举例结构体数组的应用举例 例例例例14.2 14.2 14.2 14.2 设李红、王建和赵明三个同学某学年考设李红、王建和赵明三个同学某学年考设李红、王建和赵明三个同学某学年考设李红、王建和赵明三个同学某学年考了了了了8 8 8 8门课,现在要求分别统计出这三名同学门课,现在要求分别统计出这三名同学门课,现在要求分别统计出这三名同学门课,现在要求分
19、别统计出这三名同学该学年的总成绩,并按该学年的总成绩,并按该学年的总成绩,并按该学年的总成绩,并按8 8 8 8门课总成绩的高低门课总成绩的高低门课总成绩的高低门课总成绩的高低排序输出。排序输出。排序输出。排序输出。main()struct str_name /*定义结构体类型定义结构体类型*/char name8;/*姓名姓名*/float score;/*8门课门课总成绩总成绩*/temp,stu=“li hong”,0,“wang”,0,“zhao”,0;int i,j;float x;变量定义变量定义定义结构体数组变量temp,std并为std赋初值 for (i=1;i=8;i+)p
20、rintf(“n输入第输入第%d门课的门课的成绩成绩:n”,i);for(j=0;j3;j+)printf(“姓名姓名:%s 成绩为成绩为:”,stdj.name);scanf(“%f”,&x);stdj.score=stdj.score+x;循环为循环为3名同学处理成绩名同学处理成绩循环处理循环处理循环处理循环处理8 8门课门课门课门课 for(i=0;i2;i+)for(j=i+1;j3;j+)if(stdi.scorestdj.score)temp=stdj;stdj=stdi;stdi=temp;排排排排序序序序 /*输出结果输出结果*/for (i=0;i3;i+)printf(“n
21、 姓名姓名:%s 总成绩总成绩:%6.1f”,stdi.name,stdi.score);第三节第三节 结构体与指针结构体与指针 14.3.1 14.3.1 14.3.1 14.3.1 指向结构体变量的指针指向结构体变量的指针指向结构体变量的指针指向结构体变量的指针14.3.2 14.3.2 14.3.2 14.3.2 指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针14.3.3 14.3.3 14.3.3 14.3.3 结构体指针作为函数参数结构体指针作为函数参数结构体指针作为函数参数结构体指针作为函数参数14.3.1 指向结构体变量的指针指向结构体变量的指针
22、 一个结构体变量的指针就是该变量所一个结构体变量的指针就是该变量所一个结构体变量的指针就是该变量所一个结构体变量的指针就是该变量所占据的内存段的首地址。占据的内存段的首地址。占据的内存段的首地址。占据的内存段的首地址。指向结构体指针的定义指向结构体指针的定义指向结构体指针的定义指向结构体指针的定义,与结构体变量与结构体变量与结构体变量与结构体变量的定义完全类似。的定义完全类似。的定义完全类似。的定义完全类似。如如如如:structstruct struct_namestruct_name char name10;char name10;intint num;num;float score;fl
23、oat score;strucstruc struct_namestruct_name student,*p;student,*p;#include main()struct student long num;char name20;char sex;float score;struct student stu_1;struct student*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,”Li Lin”);stu_1.sex=M;stu_1.score=89.5;printf(“No.:%ldnname:%snsex:%cnscore:%fn”,
24、stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf(“No.:%ldnname:%snsex:%cnscore:%fn”,(*p).num,(*p).name,(*p).sex,(*p).score);写出程序的运行结果说明:说明:说明:说明:(1)(1)由于成员运算符由于成员运算符由于成员运算符由于成员运算符“.”.”的运算优先级高于运算符的运算优先级高于运算符的运算优先级高于运算符的运算优先级高于运算符“*”“*”,因此因此因此因此(*p).(*p).成员名中成员名中成员名中成员名中()()不能少。不能少。不能少。不能少。(2)(2)和成员
25、运算符一样和成员运算符一样和成员运算符一样和成员运算符一样,“-”,“-”为指向运算符,是运为指向运算符,是运为指向运算符,是运为指向运算符,是运算算算算 优先级最高的运算符。优先级最高的运算符。优先级最高的运算符。优先级最高的运算符。例例例例:(*(*p).namep).name=p-name=p-name*p.p.成员名成员名成员名成员名p=&student.score;p=&student.score;不能用指向某个结构体变量的指针指向该结构不能用指向某个结构体变量的指针指向该结构不能用指向某个结构体变量的指针指向该结构不能用指向某个结构体变量的指针指向该结构体变量的某个成员体变量的某个
26、成员体变量的某个成员体变量的某个成员。14.3.2 指向结构体数组的指针指向结构体数组的指针对对结构体数组及其元素可以用指针来指向。结构体数组及其元素可以用指针来指向。例如:例如:例如:例如:structstruct struct_namestruct_name char name10;char name10;intint num;num;float score;float score;/*;/*定义结构体类型标识符定义结构体类型标识符*/structstruct struct_namestruct_name std30,*p;std30,*p;赵明赵明90909003900387879002
27、9002王建王建898990019001李红李红结构体数组结构体数组stdstdstd0std0std1std1std2std2p p赋值语句赋值语句 p=std;p=std;/*p/*p指向一个结构体数组指向一个结构体数组指向一个结构体数组指向一个结构体数组std*/std*/*/*指针变量指针变量指针变量指针变量p p存放的是数组存放的是数组存放的是数组存放的是数组stdstd的首地址的首地址的首地址的首地址*/赵明赵明909090039003878790029002王建王建898990019001李红李红结构体数组结构体数组stdstdstd0std0std1std1std2std2p
28、p思考:思考:思考:思考:赋值语句赋值语句赋值语句赋值语句 p=std;p=std;p=std+1;p=std+1;和和和和p+;p+;代表指针代表指针代表指针代表指针p p指向哪里?指向哪里?指向哪里?指向哪里?p pp p注意:注意:注意:注意:以下赋值语句都是错误的以下赋值语句都是错误的以下赋值语句都是错误的以下赋值语句都是错误的:p=&std1.score;p=&std1.score;(不能指向数组元素的成员变量不能指向数组元素的成员变量)p=&std;p=&std;(数组名本身就代表该数组数组名本身就代表该数组的首地址的首地址,因此不能使用地因此不能使用地址运算符址运算符&)&)例例
29、例例14.314.314.314.3 将例将例将例将例14.214.214.214.2统计三名同学成绩并排序的程序统计三名同学成绩并排序的程序统计三名同学成绩并排序的程序统计三名同学成绩并排序的程序,修改为用指针来完成。修改为用指针来完成。修改为用指针来完成。修改为用指针来完成。main()struct struct_name char name8;float score;std=“lihong”,0,“wang”,0,“zhao”,0;struct struct_name temp,*p,*p1;/*temp为排序时用到的临时变量为排序时用到的临时变量*/*p和和p1是指向结构体类型的指针变
30、量是指向结构体类型的指针变量*/int i,j;float x;for(i=1;i=8;i+)printf(“n输入第输入第%d门课的成绩门课的成绩:n”,i);p=std;for(j=0;jname);scanf(“%f”,&x);p-score=p-score+x;p+;/*求3名同学8门课成绩之和*/p1=std;for(i=0;i2;i+)p=p1;for(j=i+1;jscorescore)temp=*p;*p=*p1;*p1=temp;p+;p1+;/*排序*/*输出排序结果*/p=std;p=std;for(i=0;i3;i+)for(i=0;iname,p-score);p-n
31、ame,p-score);p+;p+;14.3.3 结构体指针作为函数参数结构体指针作为函数参数 结构体变量可以象其他类型的变量一样作结构体变量可以象其他类型的变量一样作结构体变量可以象其他类型的变量一样作结构体变量可以象其他类型的变量一样作为参数传递给其它函数,或者从被调函数中将为参数传递给其它函数,或者从被调函数中将为参数传递给其它函数,或者从被调函数中将为参数传递给其它函数,或者从被调函数中将函数值返回调用处。函数值返回调用处。函数值返回调用处。函数值返回调用处。有一个结构体变量有一个结构体变量stu,内含学生学号、姓名和,内含学生学号、姓名和3门课的成绩。门课的成绩。要求在要求在mai
32、n函数中赋以值,在另一函数函数中赋以值,在另一函数print中将它们打印输出中将它们打印输出#include#define FORMAT“%dn%sn%fn%fn%fn”struct studentint num;char name20;float score3;main()void print(struct student);struct student stu;stu.num=12345;strcpy(stu.name,”Li Li”);stu.score3=67.5,89,78.6;print(stu);void print(struct student stu)printf(FORMA
33、T,stu.num,stu.name,stu.score0,stu.score1,stu.score2);printf(“n”);将题目改为用指向结构体变量的指针作实参将题目改为用指向结构体变量的指针作实参void print(struct student*p)printf(FORMAT,p-num,p-name,p-score0,p-score1,p-score2);printf(“n”);print(&stu);/*主函数中的函数调用*/第四节第四节 链表链表14.4.1 14.4.1 14.4.1 14.4.1 链表的概念链表的概念链表的概念链表的概念14.4.2 14.4.2 14.4
34、.2 14.4.2 链表的建立与遍历链表的建立与遍历链表的建立与遍历链表的建立与遍历14.4.3 14.4.3 14.4.3 14.4.3 链表的维护链表的维护链表的维护链表的维护14.4.1 14.4.1 链表的概念链表的概念顺序存储结构顺序存储结构顺序存储结构顺序存储结构(数组数组数组数组)的缺点:的缺点:的缺点:的缺点:()在插入或删除一个数据时,需移动大量()在插入或删除一个数据时,需移动大量()在插入或删除一个数据时,需移动大量()在插入或删除一个数据时,需移动大量元素。元素。元素。元素。()若数据个数不确定时,必须先估计一个()若数据个数不确定时,必须先估计一个()若数据个数不确定
35、时,必须先估计一个()若数据个数不确定时,必须先估计一个可能的最大长度来定义数组,浪费内存可能的最大长度来定义数组,浪费内存可能的最大长度来定义数组,浪费内存可能的最大长度来定义数组,浪费内存空间。空间。空间。空间。()数组一经定义,很难根据具体情况扩充()数组一经定义,很难根据具体情况扩充()数组一经定义,很难根据具体情况扩充()数组一经定义,很难根据具体情况扩充或压缩。或压缩。或压缩。或压缩。所谓所谓所谓所谓链表链表链表链表,是指一种,是指一种,是指一种,是指一种动态动态动态动态的进行存的进行存的进行存的进行存储分配的一种数据结构。储分配的一种数据结构。储分配的一种数据结构。储分配的一种数
36、据结构。指针域指针域指针域指针域数据域数据域数据域数据域指针域指针域指针域指针域数据域数据域数据域数据域NULLNULL数据域数据域数据域数据域节点节点节点节点节点节点节点节点2 2节点节点节点节点n n(单项链表)(单项链表)(单项链表)(单项链表)头头头头指针指针指针指针指向下一个指向下一个指向下一个指向下一个数据域数据域数据域数据域指向上一个指向上一个指向上一个指向上一个指向下一个指向下一个指向下一个指向下一个数据域数据域数据域数据域指向上一个指向上一个指向上一个指向上一个NULLNULL数据域数据域数据域数据域指向上一个指向上一个指向上一个指向上一个(双(双(双(双向向向向链表)链表)
37、链表)链表)头头头头指针指针指针指针14.4.2 链表的建立与遍历链表的建立与遍历指针域指针域指针域指针域数据域数据域数据域数据域指针域指针域指针域指针域数据域数据域数据域数据域NULLNULL数据域数据域数据域数据域节点节点节点节点j1j1节点节点节点节点j2j2节点节点节点节点j3j3头头头头指针指针指针指针 对链表中的数据依次顺序操作,叫对链表中的数据依次顺序操作,叫对链表中的数据依次顺序操作,叫对链表中的数据依次顺序操作,叫做链表遍历。做链表遍历。做链表遍历。做链表遍历。1.链表的建立链表的建立指针域指针域指针域指针域数据域数据域数据域数据域定义节点的结构定义节点的结构定义节点的结构定
38、义节点的结构指针域指针域指针域指针域数据域数据域数据域数据域structstruct list list intint num;num;char c;char c;;*p;*p;structstruct list listnumnumc cp pnumnumc cp p简单链表的建立与输出简单链表的建立与输出structstruct list list intint num;num;char c;char c;structstruct list*next;list*next;;#define NULL 0#define NULL 0main()main()structstruct list l
39、ist list_1,list_2,list_3;list_1,list_2,list_3;structstruct list*head,*p;list*head,*p;list_1.num=1;list_1.c=A;list_1.num=1;list_1.c=A;list_2.num=2;list_2.c=B;list_2.num=2;list_2.c=B;list_3.num=3;list_3.c=C;list_3.num=3;list_3.c=C;head=&list_1;head=&list_1;list_1.next=&list_2;list_1.next=&list_2;list_
40、2.next=&list_3;list_2.next=&list_3;list_3.next=NULL;list_3.next=NULL;do do printf(“%5d,%c”,p-num,printf(“%5d,%c”,p-num,p-score);p-score);p=p-next;p=p-next;while(pwhile(p!=NULL);=NULL);与链表操作有关的函数与链表操作有关的函数与链表操作有关的函数与链表操作有关的函数1 1malloc(size),calloc(n,sizemalloc(size),calloc(n,size)在内存的动态存储区中分配一个在内存的动态
41、存储区中分配一个在内存的动态存储区中分配一个在内存的动态存储区中分配一个(n(n 个个个个)长度为长度为长度为长度为sizesize的连续空间。的连续空间。的连续空间。的连续空间。2 2free(ptrfree(ptr)释放由指针释放由指针释放由指针释放由指针ptrptr指向的内存区指向的内存区指向的内存区指向的内存区例:struct student*p;p=(struct student*)malloc(sizeof(student);free(p);返回值为void*类型建立链表的具体例子建立链表的具体例子 例例例例14.714.7输入某班输入某班输入某班输入某班3030名同学某门课程的考
42、试成绩,名同学某门课程的考试成绩,名同学某门课程的考试成绩,名同学某门课程的考试成绩,建立一个单向链表。建立一个单向链表。建立一个单向链表。建立一个单向链表。scorescorenextnextscorescorenextnextscorescorenextnextnextnextheadhead学生学生学生学生学生学生学生学生学生学生学生学生3030建立链表的演示建立链表的演示建立链表的演示建立链表的演示p2=(p2=(structstruct list*)list*)malloc(LENmalloc(LEN););p2p2p1p1p1=p2;head=p2;p1=p2;head=p2;he
43、adhead scanf(“%d”,&p2-score);scanf(“%d”,&p2-score);8989p2-next=NULL;p2-next=NULL;NULLNULLforfor循环语句循环语句 为为下一个节点分配内存空间下一个节点分配内存空间 p2=(p2=(structstruct list*)list*)malloc(LENmalloc(LEN););p2p2p2-next=NULL;p2-next=NULL;NULLNULLscanf(“%d”,&p2-score);scanf(“%d”,&p2-score);9090 p1-next=p2;p1-next=p2;p1=p2
44、;p1=p2;p1p12.链表的输出链表的输出假设已建立了下面的链表结构:假设已建立了下面的链表结构:假设已建立了下面的链表结构:假设已建立了下面的链表结构:headhead8989NULLNULL9090以下程序片段用于输出链表(以下程序片段用于输出链表(以下程序片段用于输出链表(以下程序片段用于输出链表(Ex14-7.c)Ex14-7.c)p2=head;p2=head;while(p2!=NULL)while(p2!=NULL)printfprintf(“%d”,p2-score);(“%d”,p2-score);p2=p2-next;p2=p2-next;p2p2 p2p214.4.3
45、 链表的维护链表的维护链表的维护包括:链表的维护包括:链表的维护包括:链表的维护包括:增加增加增加增加一个结点一个结点一个结点一个结点 删除删除删除删除一个结点一个结点一个结点一个结点 修改修改修改修改结点的数据结点的数据结点的数据结点的数据 结点的修改结点的修改结点的修改结点的修改指修改结点中存放的数据。指修改结点中存放的数据。注意:不能修改结点的结构。注意:不能修改结点的结构。例例14.9 14.9 键盘输入两个整数键盘输入两个整数x x和和y,y,将链表中存将链表中存放的第一个放的第一个x x的整数值修改为的整数值修改为y y。page 198page 198 scanf(“%d,%ds
46、canf(“%d,%d”,&x,&y);”,&x,&y);p2=head;p2=head;while(p2!=NULL)while(p2!=NULL)if(p2-score=x)if(p2-score=x)p2-score=y;break;p2-score=y;break;p2=p2-next;p2=p2-next;修改结点程序片断修改结点程序片断2.结点的删除结点的删除(1)p1(1)p1指向要删除结点的前一结点指向要删除结点的前一结点指向要删除结点的前一结点指向要删除结点的前一结点1 1 0 0 1 12 23 3headheadp1p1(2)p2(2)p2指向要删除的结点(指向要删除的结
47、点(指向要删除的结点(指向要删除的结点(p2=p1-next p2=p1-next)(3)(3)将将将将p2p2指向的结点从链表中删除(指向的结点从链表中删除(指向的结点从链表中删除(指向的结点从链表中删除(p1-next=p2-next)p1-next=p2-next)p2p2 (4)(4)调用调用调用调用free(p2)free(p2)释放删除结点所指向的内存空间。释放删除结点所指向的内存空间。释放删除结点所指向的内存空间。释放删除结点所指向的内存空间。增加结点增加结点分分分分三种情况:三种情况:三种情况:三种情况:()在表头增加一个结点;)在表头增加一个结点;)在表头增加一个结点;)在表
48、头增加一个结点;headheadheadheadheadhead(2)(2)在两个结点之间增加一个结点在两个结点之间增加一个结点在两个结点之间增加一个结点在两个结点之间增加一个结点headheadheadhead()在链表最后增加一个节点。)在链表最后增加一个节点。)在链表最后增加一个节点。)在链表最后增加一个节点。headhead程序中插入结点的实现程序中插入结点的实现scorescorenextnextscorescorenextnextp1p1p2p2 p2=p1-next;p2=p1-next;new=(new=(structstruct list*)list*)malloc(LENm
49、alloc(LEN););p1-next=new;new-next=p2;p1-next=new;new-next=p2;nextnextscorescorenewnew第五节第五节 共用体的概念共用体的概念14.5.1 14.5.1 14.5.1 14.5.1 共用体的定义共用体的定义共用体的定义共用体的定义14.5.2 14.5.2 14.5.2 14.5.2 共用体变量的引用共用体变量的引用共用体变量的引用共用体变量的引用所谓所谓所谓所谓“共用体共用体共用体共用体”类型类型类型类型,是指使几个不同是指使几个不同是指使几个不同是指使几个不同的变量共同占用同一段内存的数据类型的变量共同占用同
50、一段内存的数据类型的变量共同占用同一段内存的数据类型的变量共同占用同一段内存的数据类型。程序中有很多临时变量,为了节省内存空程序中有很多临时变量,为了节省内存空程序中有很多临时变量,为了节省内存空程序中有很多临时变量,为了节省内存空间,往往采用覆盖技术:即可以使几个不同的变间,往往采用覆盖技术:即可以使几个不同的变间,往往采用覆盖技术:即可以使几个不同的变间,往往采用覆盖技术:即可以使几个不同的变量共占同一段内存空间。量共占同一段内存空间。量共占同一段内存空间。量共占同一段内存空间。量量量量型型型型变变变变实实实实变量变量变量变量整型整型整型整型字符字符字符字符内存地址:内存地址:内存地址:内