C语言程序设计第7章.ppt
C语言程序设计电子教案 第7章结构与共用第第7 7章结构与共用章结构与共用 返回总目录C语言程序设计电子教案 第7章结构与共用目录目录 7.1 7.1结构类型结构类型 7.27.2共用类型共用类型 7.37.3枚举类型枚举类型 7.57.5自定义类型自定义类型 7.47.4位域位域 返回总目录 7.67.6习题七习题七C语言程序设计电子教案 第7章结构与共用基本要求:基本要求:)熟悉结构类型的定义与使用;)熟悉共用类型的定义与使用;)掌握枚举类型、位域及自定义类型的定义与使用学习重点:学习重点:)结构类型的定义与使用;)自定义类型的定义与使用;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 返回目录在日常生活中,我们常会遇到一些需要填写的登记表,如成在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址等,如图绩表、通讯地址等,如图7.17.1所示。这些表中集合了各种标准所示。这些表中集合了各种标准类型数据,无法用前面学过的任一种数据类型完全描述,因类型数据,无法用前面学过的任一种数据类型完全描述,因此,此,C C语言引入一种能集不同数据类型于一体的数据类型语言引入一种能集不同数据类型于一体的数据类型结构类型结构类型(structure)(structure)。图7.1l 结构类型的定义结构类型的定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 定义一个结构类型的一般形式为:定义一个结构类型的一般形式为:struct struct 结构名结构名 类型成员名类型成员名1 1;类型成员名类型成员名2 2;;花括弧内是该结构类型中的各个成员(或称分量),是一组花括弧内是该结构类型中的各个成员(或称分量),是一组系统标准变量类型,由它们组成一个结构类型。若把成员的系统标准变量类型,由它们组成一个结构类型。若把成员的集合称为集合称为“域表域表”,每一个成员则称为一个域。成员的命名,每一个成员则称为一个域。成员的命名规则与标准变量命名规则相同。规则与标准变量命名规则相同。l 结构类型的定义结构类型的定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 例如,通讯录的结构类型定义为:例如,通讯录的结构类型定义为:struct addr struct addr char name20;/*char name20;/*姓名姓名*/*/char department30;/*char department30;/*部门部门*/*/char address30;/*char address30;/*住址住址*/*/long int zip;/*long int zip;/*邮编邮编*/*/long int phone;/*long int phone;/*电话号码电话号码*/*/char email30;/*Email*/char email30;/*Email*/;l 结构类型的定义结构类型的定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 同样,成绩表的内容可以用另一个结构类型来表示:同样,成绩表的内容可以用另一个结构类型来表示:struct score struct score char grade20;/*char grade20;/*班级班级*/*/long int number;/*long int number;/*学号学号*/*/char name20;/*char name20;/*姓名姓名*/*/char sex;/*char sex;/*性别性别*/*/float maths;/*float maths;/*数学成绩数学成绩*/*/float database;/*float database;/*数据库成绩数据库成绩*/*/float english;/*float english;/*英语成绩英语成绩*/*/;l 结构类型的定义结构类型的定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 l 结构类型变量的定义结构类型变量的定义(3 3种方式)种方式)(1)(1)先定义结构类型再定义变量名先定义结构类型再定义变量名其一般形式为:structstruct 结构名结构名 类型成员名类型成员名1 1;类型成员名类型成员名2 2;;structstruct 结构名结构名结构变量名表结构变量名表;例如:struct scorestruct score char grade20;long int number;char name20;char sex;float maths;float database;float english;struct scorestruct score stu1,stu2stu1,stu2;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 (2)(2)在定义类型的同时定义变量在定义类型的同时定义变量这是一种双重定义,其一般形式为:struct struct 结构名结构名 类型成员名类型成员名1 1;类型成员名类型成员名2 2;结构变量名表;结构变量名表;例如:struct scorestruct score char grade20;long int number;char name20;char sex;float maths;float database;float english;stu1,stu2stu1,stu2;l 结构类型变量的定义结构类型变量的定义(3 3种方式)种方式)C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 (3)(3)直接定义结构类型变量直接定义结构类型变量若仅需要结构变量,则定义时可以不出现结构名。其一般形式为:struct struct 类型成员名类型成员名1 1;类型成员名类型成员名2 2;结构变量名表;结构变量名表;例如:structstructchar grade20;long int number;char name20;char sex;float maths;float database;float english;stu1,stu2stu1,stu2;l 结构类型变量的定义结构类型变量的定义(3 3种方式)种方式)C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 上3例中的结构变量stu1与stu2定义后,具有结构类型struct score定义的结构。如图7.2所示。(图中结构变量的各个成员的值是假设的)l 结构类型变量的定义结构类型变量的定义(3 3种方式)种方式)C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 在编译时,不对结构类型分配空间,只对结构变量分配空间。Turbo C编译器将自动地分配适当的内存区域给结构变量的各个成员变量。结构变量stu1的内存分配情况(设字符占1bytes,整型数占2 bytes)如表7.1所示。l 结构类型变量的定义结构类型变量的定义(3 3种方式)种方式)C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 l 结构变量引用规则结构变量引用规则(1)(1)成员的访问。成员的访问。对结构变量中各个成员的访问,用操作符“.”表示,其格式为:结构变量名结构变量名.成员名成员名操作符“.”称为成员运算符,具有最高优先级。C允许直接赋值给一个结构变量成员,而不能将一个结构变量作为一个整体进行输入和输出。例如,若系统已经进行了如图7.2所示的定义,则将30301赋给其结构变量stu1中的number成员的正确语句是:stu1.number=30301;而以下语句是错误的:scanf(%s,%ld,%s,%c,%f,%f,%f,&stu1);printf(%s,%d,%s,%c,%f,%f,%f n,stu1);C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 (2)(2)对成员变量可以象普通变量一样进行各种运算。对成员变量可以象普通变量一样进行各种运算。下列运算是正确的:stu1.number+;+stu1.number;注意:运算stu1.number+是对stu1中的number进行自加运算,而不是先对stu1进行自加运算。l 结构变量引用规则结构变量引用规则C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 (3)(3)可以引用成员的地址,也可以引用结构变量的地址。可以引用成员的地址,也可以引用结构变量的地址。如对于如图7.2的结构类型:scanf(%ld,&stu1.number);/*键盘输入stu1.number的值*/printf(%ld,stu1.number);/*输出stu1.number的值*/printf(%c,&stu1);/*输出stu1的首地址*/结构体变量的地址主要用于作函数参数,传递结构体的地址值。l 结构变量引用规则结构变量引用规则C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 l 结构变量的初始化结构变量的初始化可以在定义结构变量的同时,对结构变可以在定义结构变量的同时,对结构变量中的各个成员进行初始化。初始化时量中的各个成员进行初始化。初始化时注意数据类型一致性。注意数据类型一致性。C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 例例7.17.1在定义结构类型的同时进行结构变量的定义及初始化。在定义结构类型的同时进行结构变量的定义及初始化。#include#include struct addrstruct addr char name20;char name20;char department30;char department30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;a=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL;a=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL;main()main()printfprintf(name:%sndepartment:%snaddress:%sn,a.name,a.department,a.address);(name:%sndepartment:%snaddress:%sn,a.name,a.department,a.address);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);l 结构变量的初始化结构变量的初始化C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.17.1.1 结构类型的定义、初始化与引用结构类型的定义、初始化与引用 例例7.27.2先定义结构类型,再进行结构变量的定义及初始化。先定义结构类型,再进行结构变量的定义及初始化。#include#include main()main()struct addrstruct addr char name20;char name20;char depart30;char depart30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;struct addr a=Liu Lin,Maths,17 BeiHuang Road,10008,856432,struct addr a=Liu Lin,Maths,17 BeiHuang Road,10008,856432,LL;LL;printf(printf(name:%sndepartment:%snaddress:%sn,a.name,a.depart,a.address);name:%sndepartment:%snaddress:%sn,a.name,a.depart,a.address);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);l 结构变量的初始化结构变量的初始化C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.27.1.2 结构类型数组结构类型数组 l 1.1.结构数组定义结构数组定义与定义结构变量的方法相似,结构数组只需说明其为数组与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存即可。例如,定义一个能保存3535个同学的通讯录结构数组,个同学的通讯录结构数组,格式格式1 1为:为:struct addrstruct addr char name20;char name20;char depart30;char depart30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;struct addrstruct addr stu35stu35;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.27.1.2 结构类型数组结构类型数组 与定义结构变量的方法相似,结构数组只需说明其为数组与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存即可。例如,定义一个能保存3535个同学的通讯录结构数组,个同学的通讯录结构数组,格式格式2 2为:为:struct addrstruct addr char name20;char name20;char depart30;char depart30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;stu35stu35;l 1.1.结构数组定义结构数组定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.27.1.2 结构类型数组结构类型数组 与定义结构变量的方法相似,结构数组只需说明其为数组与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存即可。例如,定义一个能保存3535个同学的通讯录结构数组,个同学的通讯录结构数组,格式格式3 3为:为:structstruct char name20;char name20;char depart30;char depart30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;stu35stu35;l 1.1.结构数组定义结构数组定义C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.27.1.2 结构类型数组结构类型数组 l 2.2.结构数组的初始化结构数组的初始化示例一在定义结构类型的同时进行结构数组的定义及初始化。示例一在定义结构类型的同时进行结构数组的定义及初始化。#include#include struct addrstruct addr char name20;char name20;char department30;char department30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;stu3stu3=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Huang Lu,Office,118 HengHuanRoad,100070,833932,Huang Lu,Office,118 HengHuanRoad,100070,833932,“Huang_L”,“Huang_L”,Wang Min,Design,1010 Zhongshan Road,Wang Min,Design,1010 Zhongshan Road,400030,674322,WangM;400030,674322,WangM;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.27.1.2 结构类型数组结构类型数组 示例二先定义结构类型,再进行结构数组的定义及初始化。示例二先定义结构类型,再进行结构数组的定义及初始化。#include#include struct addrstruct addr char name20;char name20;char department30;char department30;char address30;char address30;long int zip;long int zip;long int phone;long int phone;char email30;char email30;struct addrstruct addr stu3=stu3=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Huang Lu,Office,118 HengHuanRoad,100070,833932,Huang Lu,Office,118 HengHuanRoad,100070,833932,“Huang_L”,“Huang_L”,Wang Min,Design,1010 Zhongshan Road,Wang Min,Design,1010 Zhongshan Road,400030,674322,WangM;400030,674322,WangM;l 2.2.结构数组的初始化结构数组的初始化C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.37.1.3 结构类型数据的指针结构类型数据的指针 l 1.1.指向结构变量的指针指向结构变量的指针(2)定义指向结构类型变量的指针变量:struct 结构名*指针变量名;也可将所定义的指针变量指向结构类型变量(注意,它只能指向一个结构类型变量,而不能指向结构类型变量的某一成员)。如:指针变量=&结构变量;(3)引用形式如下:指针变量指针变量-成员成员其中算符“-”称为指向运算符,由一个减号“-”和一个小于号“”组成。下面是与指向运算符相关的几种运算:C语言程序设计电子教案 第7章结构与共用下面用简单例子来说明指向结构变量的指针变量的应用,指针指向的示意图如图7.4。在这段程序中,前两个printf函数是输出stu1的各个成员的值,后两个printf函数使用p-num的形式来输出stu1各成员的值,而结果是相同的。7.1结构类型结构类型7.1.37.1.3 结构类型数据的指针结构类型数据的指针 l 1.1.指向结构变量的指针指向结构变量的指针例例例例7.37.3:C语言程序设计电子教案 第7章结构与共用在C语言中,当用一个指针变量p指向某个结构变量后,则以下三种结构成员的引用是等价的:结构变量结构变量.成员名成员名;p-p-成员名成员名;(*p).(*p).成员名成员名;一般采用前两种方法之一。7.1结构类型结构类型7.1.37.1.3 结构类型数据的指针结构类型数据的指针 l 1.1.指向结构变量的指针指向结构变量的指针C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.37.1.3 结构类型数据的指针结构类型数据的指针 l 2.2.指向结构数组的指针指向结构数组的指针可以用指针或指针变量来指向结构数组及其元素,其定义和使用原则与指向结构变量的指针相同。例例例例7.47.4:C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.37.1.3 结构类型数据的指针结构类型数据的指针 l 3.3.用指向结构的指针作函数参数用指向结构的指针作函数参数把一个结构变量的值传递到另一个函数,有把一个结构变量的值传递到另一个函数,有3 3种方式:种方式:传递结构成员传递结构成员:把结构变量的成员按普通变量一样进行按值传递,把结构变量的成员按普通变量一样进行按值传递,此时调用函数仅使用结构的部分成员。此时调用函数仅使用结构的部分成员。传递结构变量传递结构变量:用结构变量作函数参数进行整体传送。但是这种用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个按值传送,特别是成员为数组时将会使传送传送要将全部成员逐个按值传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。的时间和空间开销很大,严重地降低了程序的效率。传递结构指针传递结构指针:即用指针变量(或结构数组名)作函数参数进行即用指针变量(或结构数组名)作函数参数进行传送,这里由实参传向形参的只是地址,从而减少了时间和空间的传送,这里由实参传向形参的只是地址,从而减少了时间和空间的开销。开销。例例例例7.57.5,例,例,例,例7.67.6:C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.47.1.4 结构的嵌套结构的嵌套 结构类型的嵌套结构就是成员也可以是一个结构变量,即允许结构类型的嵌套结构就是成员也可以是一个结构变量,即允许“嵌套嵌套”的结构类型。例如图的结构类型。例如图7.67.6所示的结构类型。所示的结构类型。struct subjectstruct subject float maths;float maths;float database;float database;float english;float english;struct score struct score char grade20;char grade20;long int number;long int number;char name20;char name20;char sex;char sex;struct subject course struct subject course stu1,stu2;stu1,stu2;C语言程序设计电子教案 第7章结构与共用由于成员本身又属一个结构类型,在访问成员时,则要用若干个由于成员本身又属一个结构类型,在访问成员时,则要用若干个成员运算符,逐级找到最低一级的成员。系统只能对最低的成员成员运算符,逐级找到最低一级的成员。系统只能对最低的成员进行赋值或存储以及运算。例如,对上面定义的进行赋值或存储以及运算。例如,对上面定义的struct scorestruct score结结构变量构变量stu1stu1,可以这样访问各成员:,可以这样访问各成员:stu1.namestu1.name不能是不能是stu1.subjectstu1.subject,因为,因为subjectsubject本身是一个结构变量。同理,本身是一个结构变量。同理,下面语句是正确的:下面语句是正确的:sum=stu1.course.maths+stu2.course.maths;sum=stu1.course.maths+stu2.course.maths;stu2.course.maths=stu1.course.maths;stu2.course.maths=stu1.course.maths;7.1结构类型结构类型7.1.47.1.4 结构的嵌套结构的嵌套 C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 利用在利用在结构变量中所包含的指针类型成员结构变量中所包含的指针类型成员,用它来,用它来指向指向其它结构类型数据其它结构类型数据,或,或指向与自身所在结构类型相同的指向与自身所在结构类型相同的结构类型数据结构类型数据,以这种方法来定义一个链表。例如:,以这种方法来定义一个链表。例如:struct stustruct stu int num;int num;char name20;char name20;float score;float score;struct stustruct stu*next;*next;l 1.1.链表概述链表概述C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 其中其中nextnext是指针类型的成员名,它指向是指针类型的成员名,它指向struct stustruct stu类型数类型数据(即据(即nextnext所在的结构类型数据)。构成的链表结构如图所在的结构类型数据)。构成的链表结构如图7.87.8所示。该链表中每一个结点都属于所示。该链表中每一个结点都属于struct stustruct stu类型,其类型,其成员成员nextnext存放下一结点的地址。存放下一结点的地址。l 1.1.链表概述链表概述C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 2.2.建立与输出链表建立与输出链表在定义结构类型时,系统并未实际分配存储空间。为能让链表在定义结构类型时,系统并未实际分配存储空间。为能让链表在需要时动态地开辟和释放一个结点的存储单元,语言编译系在需要时动态地开辟和释放一个结点的存储单元,语言编译系统的库函数提供以下相关库函数:统的库函数提供以下相关库函数:1.1.void*void*malloc(unsignedmalloc(unsigned size)size)在内存的动态存储区中分在内存的动态存储区中分配一长度为配一长度为sizesize的连续空间。分配空间成功则返回值是一的连续空间。分配空间成功则返回值是一个空类型指针,指向该分配域的起始地址。否则返回值为个空类型指针,指向该分配域的起始地址。否则返回值为NULLNULL。2.2.void*void*calloc(unsignedcalloc(unsigned n,unsigned size)n,unsigned size)在内存的动在内存的动态区存储中分配态区存储中分配n n个长度为个长度为sizesize的连续空间。分配空间成的连续空间。分配空间成功则返回值是一个空类型指针,指向该分配域的起始地址。功则返回值是一个空类型指针,指向该分配域的起始地址。否则返回值为否则返回值为NULLNULL。3.3.void void free(voidfree(void*ptrptr)释放由释放由ptrptr指向的内存区。指向的内存区。C语言程序设计电子教案 第7章结构与共用链表的建立过程:链表的建立过程:定义链表数据结构;定义链表数据结构;创建一个空表创建一个空表head=NULLhead=NULL;输入数据有效,重复以下操作:输入数据有效,重复以下操作:a)a)利用利用mallocmalloc()()函数向系统申请分配一个节点函数向系统申请分配一个节点p1p1,并初始化,并初始化p1p1的的数据项和指针项。数据项和指针项。b)b)若是空表,将新节点连接到表头;若是非空表,将新节点接到若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;表尾;注意:链表的头指针是非常重要的参数,因为对链表的输出注意:链表的头指针是非常重要的参数,因为对链表的输出和查找都要从链表的头开始,所以链表创建成功后,要和查找都要从链表的头开始,所以链表创建成功后,要返回一个链表头节点的地址,即头指针。返回一个链表头节点的地址,即头指针。7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 2.2.建立与输出链表建立与输出链表C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 2.2.建立与输出链表建立与输出链表链表的输出过程:链表的输出过程:首先找到链表头首先找到链表头headhead,只有是非空链表才将节点的值输出,只有是非空链表才将节点的值输出,若是空表则立即退出输出过程;若是非空链表,则通过指针的若是空表则立即退出输出过程;若是非空链表,则通过指针的不断向后移动逐个输出链表中各个节点的值,直到链表尾。算不断向后移动逐个输出链表中各个节点的值,直到链表尾。算法流程图如图法流程图如图7.107.10所示,即:所示,即:找到表头找到表头p=headp=head;当链表非空当链表非空p!=NULLp!=NULL时,重复以下操作;时,重复以下操作;a)a)输出节点输出节点p p数据数据p-num;p-num;b)b)跟踪跟踪p p下一节点下一节点p=p-next;p=p-next;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 2.2.建立与输出链表建立与输出链表headhead1NULLNULLp1输入输入1 1p2输入输入2 22NULLNULLp1输入输入3 33NULLNULLp1p2p2输入输入4 44NULLNULLp1p2输入输入1 1,则结束,则结束1 1)建立链表:)建立链表:2 2)输出链表:)输出链表:1NULLNULLp1p22NULLNULLp13NULLNULLp1p2p2headhead4NULLNULLtemp输出输出1 1temp输出输出2 2temp输出输出3 3temp输出输出4 4C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作从链表中删除一个节点有三种情况:删除从链表中删除一个节点有三种情况:删除链表头节点、删除链表中间的某一节点、链表头节点、删除链表中间的某一节点、删除链表的尾节点,如图删除链表的尾节点,如图7.117.11所示。由于所示。由于删除的节点可能是链表的头,会对链表的删除的节点可能是链表的头,会对链表的头指针进行修改,所以删除节点函数的返头指针进行修改,所以删除节点函数的返回值定义为返回结构类型的指针。回值定义为返回结构类型的指针。C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作附图链表中第附图链表中第i个结点的删除过程个结点的删除过程 heada1ai-1aipheada1pss s p p-next;next;p p-next next s s-next;next;free(r);ai-1ai+1aianan(a)寻找第)寻找第i1个结点,并由个结点,并由p指向它指向它(b)删除并释放第)删除并释放第i个结点个结点C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作将一个节点插入到一个已有的链表中也将一个节点插入到一个已有的链表中也有三种情况,如图有三种情况,如图7.127.12所示。插入的节所示。插入的节点可以在表头、表中或表尾。点可以在表头、表中或表尾。C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作a1heada4a5a6p1(a)寻找插入位置)寻找插入位置(b)申请新的结点)申请新的结点a2a3p3e(c)插入过程)插入过程附图在链表第附图在链表第5个结点前插入一个结点的过程示意图个结点前插入一个结点的过程示意图p2a1heada4a5a6a2a3ep1p3p2与与a a5 5连接连接p1p1-nextnextp2p2a a4 4与与a a5 5断链,插入断链,插入p1p1p3p3-nextnextp1p1;C语言程序设计电子教案 第7章结构与共用7.1结构类型结构类型7.1.57.1.5 用指针处理链表用指针处理链表 l 3.3.链表的删除与插入操作链表的删除与插入操作例例7.87.8创建包含学号、姓名节点的单链表。其节点数不限,表创建包含学号、姓名节点的单链表。其节点数不限,表以学号为序,低学号的在前,高学号的在后,以输入姓名为空以学号为序,低学号的在前,高学号的在后,以输入姓名为空作结束。在此链表中,要求删除一个给定姓名的节点,并插入作结束。在此链表中,要求删除一个给定姓名的节点,并插入一个给定学号和姓名的节点。一个给定学号和姓名的节点。解题思路解题思路链表定义与输出函数可以参见前例。对于插入函数,链表定义与输出函数可以参见前例。对于插入函数,利用利用malloc()malloc()函数向系统申请分配一个节点存放输入的姓名和函数向系统申请分配一个节点存放输入的姓名和学号,并让新的学号与各节点的学号比较,以确定插入的节点学号,并让新的学号与各节点的学号比较,以确定插入的节点位于表头、表中或表尾。对于删除函数,应根据指定的学生姓位于表头、表中或表尾。对于删除函数,应根据指定的学生姓名,在链表中从头到尾依此查找各节点,并与各节点的学生姓名,在链表中从头到尾依此查找各节点,并与各节点的学生姓名比较,若查找成功名比较,若查找成功(相同相同)则修改指针并释放内存空间,否则则修改指针并释放内存空间,否则提示找不到节点后退出。提示找不到节点后退出。C语言程序设计电子教案 第7章结构与共用7.2共用类型共用类型7.2.17