《结构体、共用体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体与枚举类型.ppt(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第8章 结构体共用体与枚举类型 1第第8章章结构体、共用体与枚举类型结构体、共用体与枚举类型本章要求:本章要求:理解结构体类型的概念,掌握结构体变量的定义和使用;理解结构体类型的概念,掌握结构体变量的定义和使用;掌握结构体数组、结构体指针的定义和使用;掌握结构体数组、结构体指针的定义和使用;理解链表的概念,掌握动态链表的常见操作;理解链表的概念,掌握动态链表的常见操作;理解共用体的概念,掌握共用体变量的定义和使用。理解共用体的概念,掌握共用体变量的定义和使用。本章重点:本章重点:动态链表的常见操作动态链表的常见操作本章难点:本章难点:动态链表的常见操作动态链表的常见操作 第8章 结构体共用体
2、与枚举类型 2第第8章章结构体、共用体与枚举类型结构体、共用体与枚举类型8.1结构体类型与结构体变量结构体类型与结构体变量8.2结构体数组结构体数组8.3结构体与函数结构体与函数8.4动态数据结构动态数据结构链表链表8.5共用体共用体8.6枚举类型枚举类型8.7自定义类型标识符(自定义类型标识符(typedef)第8章 结构体共用体与枚举类型 3第第8章章结构体、共用体与枚举类型结构体、共用体与枚举类型8.1 8.1 结构体结构体 C C语语言提供一种能集中不同数据言提供一种能集中不同数据类类型于一体的数据型于一体的数据类类型型结结构体构体类类型。型。结结构体构体类类型的型的变变量可以量可以拥
3、拥有不同数有不同数据据类类型的成型的成员员,是不同数据,是不同数据类类型成型成员员的集合。的集合。结构体是结构体是一种构造数据类型一种构造数据类型 用途:把不同类型的数据组合成一个整体用途:把不同类型的数据组合成一个整体自定自定义数据类型义数据类型 第8章 结构体共用体与枚举类型 48.1结构体类型与结构体变量结构体类型与结构体变量8.1.1什么是结构体类型什么是结构体类型 第第4章学习的数组是一种简单构造类型数据,数组中章学习的数组是一种简单构造类型数据,数组中的各元素是属于同一个类型的。但在实际处理的问题中,的各元素是属于同一个类型的。但在实际处理的问题中,常会遇到这样一类数据,它由多个属
4、性各不相同的数据项常会遇到这样一类数据,它由多个属性各不相同的数据项组成,各个数据项用来描述一个共同的对象。组成,各个数据项用来描述一个共同的对象。结构体(结构体(structure)是一种数据类型。)是一种数据类型。C语言本身没语言本身没有提供具体的结构类型,但提供了说明结构体类型的方法。有提供具体的结构类型,但提供了说明结构体类型的方法。第8章 结构体共用体与枚举类型 58.1.2结构体的声明结构体的声明 声明结构体类型的一般形式:声明结构体类型的一般形式:struct结构体名结构体名结构成员结构成员1;结构成员结构成员2;结构成员结构成员n;8.1结构体类型与结构体变量结构体类型与结构体
5、变量 第8章 结构体共用体与枚举类型 6例如例如:定义一个可描述学生基本情况的结构体类型如下:定义一个可描述学生基本情况的结构体类型如下:structstudentintnum;charname20;charsex;intage;floatscore;8.1结构体类型与结构体变量结构体类型与结构体变量 第8章 结构体共用体与枚举类型 7例例structstudentintnum;charname20;charsex;intage;floatscore;structstudentstu1,stu2;8.1.3 8.1.3 结构体变量的定义结构体变量的定义 定义好一个结构体类型后(也可以理解为是我
6、们用户自定义好一个结构体类型后(也可以理解为是我们用户自己定义的类型),我们可以将其看作是和己定义的类型),我们可以将其看作是和intint、charchar、floatfloat等数据类型一样的一个新的数据类型,可以用它定义变量,等数据类型一样的一个新的数据类型,可以用它定义变量,通过变量对结构体中各成员的数据进行处理。通过变量对结构体中各成员的数据进行处理。1.1.先定义结构体类型,再定义结构体变量先定义结构体类型,再定义结构体变量一般形式:一般形式:struct结构体名结构体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.;struct结构体名结构体名变量名表
7、列变量名表列;8.1结构体类型与结构体变量结构体类型与结构体变量 第8章 结构体共用体与枚举类型 82.定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量一般形式:一般形式:struct结构体名结构体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.变量名表列变量名表列;例例structstudentintnum;charname20;charsex;intage;floatscore;stu1,stu2;8.1.3 8.1.3 结构体变量的定义结构体变量的定义 第8章 结构体共用体与枚举类型 93.直接定义结构体变量直接定义结构体变量一般形式:一般
8、形式:struct类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.变量名表列变量名表列;例例structintnum;charname20;charsex;intage;floatscore;stu1,stu2;8.1.3 8.1.3 结构体变量的定义结构体变量的定义 第8章 结构体共用体与枚举类型 108.1.3 8.1.3 结构体变量的引用结构体变量的引用1结构体变量的引用格式结构体变量的引用格式 结构体变量名结构体变量名.成员名成员名其中:其中:“.”是成员运算符,它在所有的运算符中优先级最高。是成员运算符,它在所有的运算符中优先级最高。例如,对上小节定义的学生
9、情况结构体变量例如,对上小节定义的学生情况结构体变量stu1变量进行赋值:变量进行赋值:stu1.num=10001;strcpy(stu1.name,”zhang”);stu1.sex=M;stu1.age=19;stu1.score=88;不能把结构变量作为整体进行输入输出不能把结构变量作为整体进行输入输出:scanf(“%d%s%c%d%f”,stu1);正确的引用方式可以是:正确的引用方式可以是:gets(stu1.name);scanf(“%d%c%d%f”,&stu1.num,&stu1.sex,&stu1.age,&stu1.score);第8章 结构体共用体与枚举类型 112结
10、构体嵌套时逐级引用结构体嵌套时逐级引用structdateintmonth;intday;intyear;structpersoncharname20;charsex;structdatebirthday;若有定义:若有定义:structpersonperson1;这时可以这样访问这时可以这样访问person1中的成员中的成员month:nameSexbirthdaymonthdayyear8.1.3 8.1.3 结构体变量的引用结构体变量的引用 第8章 结构体共用体与枚举类型 128.1.3 8.1.3 结构体变量的引用结构体变量的引用33.同类型结构体变量间的整体赋值同类型结构体变量间的整
11、体赋值 结构体变量可以通过整体赋值,将一个结构体变量中的结构体变量可以通过整体赋值,将一个结构体变量中的所有数据,赋给另一个结构体类型相同的结构体变量中对应所有数据,赋给另一个结构体类型相同的结构体变量中对应的数据成员。的数据成员。例例8-1建立一个学生的基本情况表,然后将其打印输出。建立一个学生的基本情况表,然后将其打印输出。程序如下程序如下:第8章 结构体共用体与枚举类型 13#include#includemain()structstudentintnum;charname20;charsex;intage;floatscore;stu1,stu2;stu1.num=10001;strc
12、py(stu1.name,zhang);stu1.sex=M;stu1.age=19;stu1.score=88;stu2=stu1;printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score);printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,stu2.name,stu2.sex,stu2.age,stu2.score);程序输出结果如下:stu1:10001,zhang,M,19,88.00stu2:10001,zhang,M,19,88.00 第8章 结构体共用
13、体与枚举类型 14struct结构体名结构体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例例structstudentintnum;charname20;charsex;intage;floatscore;stu1=10001,zhang,M,19,88;8.1.4 结构体变量的初始化形式:形式:第8章 结构体共用体与枚举类型 158.1.6 指向结构体的指针 指指向向结结构构体体变变量量的的指指针针的的值值是是该该结结构构体体变变量量所所分分配配的的存存储储区区域域的首地址。的首地址。1.1.结构指针变量的定义结构指针变
14、量的定义 例:struct student int num;char name20;char sex;int age;float score;stu1=10001,”zhang”,M,19,88;struct student *p=stu1;P指向结构体变量的指针8819Mzhang10001 第8章 结构体共用体与枚举类型 168.1.6 指向结构体的指针 2.2.通过指针访问结构体变量的成员通过指针访问结构体变量的成员 结构变量中简单成员的引用形式有下面三种:结构变量中简单成员的引用形式有下面三种:结构变量名结构变量名.成员名(名字引用);成员名(名字引用);结构指针结构指针-成员名(指针
15、引用);成员名(指针引用);(*结构指针)结构指针).成员名(将指针转化为名字引用);成员名(将指针转化为名字引用);例:若有定义:例:若有定义:structstudent*p,stu1;且且p=&stu1;则要访问则要访问stu1的成员(如的成员(如age)有下三种方式:)有下三种方式:stu1.age或或p-age或或(*p).age 第8章 结构体共用体与枚举类型 178.2 8.2 结构体数组结构体数组8.1.1结构体数组的定义结构体数组的定义 结构体数组的定义方式同结构体变量一样,也有结构体数组的定义方式同结构体变量一样,也有3种方法,种方法,只需把结构体变量换成结构体数组即可。只需
16、把结构体变量换成结构体数组即可。例:struct student int num;char name20;char sex;int age;float score;struct student stu10;numnamesexagescorenumnamesexstu0stu129B 第8章 结构体共用体与枚举类型 18结构体数组的初始化,与通常数组的初始化类似。例如:结构体数组的初始化,与通常数组的初始化类似。例如:structstudentintnum;charname20;charsex;intage;floatscore;stu4=10001,Zhang,M,19,80,10002,L
17、i,M,18,78,10003,He,F,20,92.5,10004,Cheng,F,18,70;v结构体数组的初始化结构体数组的初始化8.2 8.2 结构体数组结构体数组结构体数组引用方式:结构体数组引用方式:结构体数组名结构体数组名 下标下标.成员名成员名 例:例:stu1.age+第8章 结构体共用体与枚举类型 198.2.2结构体数组与指针结构体数组与指针 指指向向结结构构体体数数组组的的指指针针的的值值是是该该结结构构体体数数组组所所分分配配的的存存储储区区域的首地址。域的首地址。例:struct student int num;char name20;char sex;int ag
18、e;float score;struct student *p;struct student stu10;p=stu;p就是指向结构体数组就是指向结构体数组stu的指针(如的指针(如右右图所示)图所示)第8章 结构体共用体与枚举类型 20 结构体数组的应用实例结构体数组的应用实例 例例8-3#defineN10#include#includestructstudent/*定义定义student结构体类型结构体类型*/intnum;charname20;floatscore3;main()inti,j;structstudentstuN;for(i=0;iN;i+)/*用用for循环输入循环输入
19、10名学生的信息名学生的信息*/scanf(%d,%s,&stui.num,stui.name);for(j=0;j3;j+)/*输入每个学生三门课的成绩输入每个学生三门课的成绩*/scanf(%f,&stui.scorej);for(i=0;iN;i+)printf(%d,stui.num);printf(%s,stui.name);printf(%6.1f,%6.1f,%6.1fn,stui.score0,stui.score1,stui.score2);第8章 结构体共用体与枚举类型 21例例8-4:用指向结构体数组的指针改写例用指向结构体数组的指针改写例8-3#defineN10#in
20、clude#includestructstudentintnum;charname20;floatscore3;main()inti,j;structstudent*p,stuN;p=stu;for(i=0;iN;i+)scanf(%d,%s,&stui.num,stui.name);for(j=0;j3;j+)scanf(%f,&stui.scorej);for(p=stu;pnum);printf(%s,p-name);printf(%6.1f,%6.1f,%6.1fn,p-score0,p-score1,p-score2);第8章 结构体共用体与枚举类型 228.3结构体与函数结构体与函
21、数 结构体类型的变量可以作函数的形参,调用时结构体类型的变量可以作函数的形参,调用时C直接直接把同类型结构体实参变量的各个数据成员的值全部复制把同类型结构体实参变量的各个数据成员的值全部复制给形参的结构体变量。为了提高效率和通用性,可以用给形参的结构体变量。为了提高效率和通用性,可以用指向结构体变量(或数组)的指针作为函数的形参。函指向结构体变量(或数组)的指针作为函数的形参。函数也可以返回结构体类型数据到主调函数中。数也可以返回结构体类型数据到主调函数中。第8章 结构体共用体与枚举类型 238.3.1结构体变量作函数参数结构体变量作函数参数 例8-5 在例8-3中,10名学生的信息输出改为通
22、过调用print函数完成。void print(struct student stu)void print(struct student stu)printf(%d,%s,%6.1f,%6.1f,%6.1fn,stu.num,stu.name,printf(%d,%s,%6.1f,%6.1f,%6.1fn,stu.num,stu.name,stu.score0,stu.score1,stu.score2);stu.score0,stu.score1,stu.score2);#define N 10#define N 10#include#include#include#includestruc
23、t studentstruct student ;main()main()int i,j;int i,j;struct student stuN;struct student stuN;void print(struct student stu);void print(struct student stu);for(i=0;iN;i+)for(i=0;iN;i+)print(stui);/print(stui);/调用调用printprint函数函数 第8章 结构体共用体与枚举类型 248.3.2返回结构体的函数返回结构体的函数例例8-6建立10名学生的信息表,每个学生的数据包括学号、姓名、及
24、三门课的成绩。输出总分最高的学生记录,要求将查找该记录的过程编制为函数。/查找最高分学生的记录函数,返回值为指向该记录的指针查找最高分学生的记录函数,返回值为指向该记录的指针student*search_max(student*x,intn)inti,k=0;for(i=1;ixk.sum)k=i;returnx+k;第8章 结构体共用体与枚举类型 258.4动态数据结构动态数据结构链表链表 8.4.2链表的基本结构链表的基本结构 1头指针(头指针(head)是一个指针变量,用来存放链表中第一个结点的地址。是一个指针变量,用来存放链表中第一个结点的地址。2链表中每一结点一般由两大部分组成:链表
25、中每一结点一般由两大部分组成:(1)数据域,用于存放用户需要用的实际数据,可以是一个)数据域,用于存放用户需要用的实际数据,可以是一个数据项,也可以是多个数据项。数据项,也可以是多个数据项。(2)指针域,用于存放和该结点相链接的下一个结点的地址)指针域,用于存放和该结点相链接的下一个结点的地址,一般通过一个指针变量来实现。,一般通过一个指针变量来实现。3尾结点尾结点 最后一个结点因其后续无结点,该指针域不再指向其他结最后一个结点因其后续无结点,该指针域不再指向其他结点,它称为尾结点,它的地址部分存放一个点,它称为尾结点,它的地址部分存放一个“NULL”(表示(表示空地址),链表到此结束。空地址
26、),链表到此结束。第8章 结构体共用体与枚举类型 268.4动态数据结构动态数据结构链表链表 8.4.3 8.4.3 链表结点的定义链表结点的定义链表结点数据可以用结构体来描述,如图链表结点数据可以用结构体来描述,如图8-4所示中的链表所示中的链表结点就可通过结构体定义如下:结点就可通过结构体定义如下:structstudentintnum;floatscore;structstudent*next;以上定义了一个结构体以上定义了一个结构体student类型,类型,student类型数据包类型数据包括括3个数据成员:个数据成员:int类型类型num、float类型的类型的score和指向另一和
27、指向另一个个student类型数据的指针变量类型数据的指针变量next。第8章 结构体共用体与枚举类型 278.4.4动态存储空间的建立和释放动态存储空间的建立和释放 1动态存储空间的建立动态存储空间的建立(1)malloc函数,其函数原型为:函数,其函数原型为:void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为其作用是在内存的动态存储区中分配一个长度为size的连续空间。的连续空间。(2)sizeof(type)运算符运算符计算所给数据类型计算所给数据类型type的字节数,主要用来计算链表中结点所的字节数,主要用来计算链表中结点所占动态存储空
28、间的字节数。占动态存储空间的字节数。(3)calloc函数,其函数原型为:函数,其函数原型为:void*calloc(unsignedn,unsignedsize);其作用是在内存的动态区存储中分配其作用是在内存的动态区存储中分配n个长度为个长度为size的连续空间。的连续空间。第8章 结构体共用体与枚举类型 288.4.4动态存储空间的建立和释放动态存储空间的建立和释放 2.动态存储空间的释放动态存储空间的释放free函数函数,其函数原型为:其函数原型为:voidfree(void*p);其作用是释放由其作用是释放由p指向的内存区,使这部分内存区能被其他指向的内存区,使这部分内存区能被其他变
29、量使用。变量使用。p是调用是调用calloc或或malloc函数时返回的值。函数时返回的值。链表的基本操作包括建立链表、输出链表、查找链表链表的基本操作包括建立链表、输出链表、查找链表中某个结点、在链表中插入一个新的结点、删除链表中的中某个结点、在链表中插入一个新的结点、删除链表中的某个结点。某个结点。第8章 结构体共用体与枚举类型 298.4.5动态链表的建立动态链表的建立 建立链表的主要步骤:(链表结点为建立链表的主要步骤:(链表结点为structstudent类型数据结构)类型数据结构)(1 1)先设三个指针变量:先设三个指针变量:head、p1、p2,它们都是用来指向,它们都是用来指向
30、structstudent类型数据的。类型数据的。structstudent*head=NULL,*p1,*p2;head:头指针变量,指向链表的第一个结点,用作函数返回值。:头指针变量,指向链表的第一个结点,用作函数返回值。P1:指向新申请的结点。:指向新申请的结点。P2:指向链表的尾结点,用:指向链表的尾结点,用P2-next=P1,实现将新申请的结点,实现将新申请的结点插入到链表尾,使之成为新的尾结点。插入到链表尾,使之成为新的尾结点。1.1.(2 2)malloc函数开辟第一个结点,并使函数开辟第一个结点,并使head和和p2都指向它。都指向它。head=p2=(structstude
31、nt*)malloc(sizeof(structstudent);/*申请一个新申请一个新结点的空间结点的空间*/scanf(%d%f,&p2-num,&p2-score);/*读入数据读入数据*/第8章 结构体共用体与枚举类型 308.4.5动态链表的建立动态链表的建立(3)再用再用malloc函数开辟另一个结点并使函数开辟另一个结点并使p1指向它,接着输入该结指向它,接着输入该结点的数据,并与上一结点相连,且使点的数据,并与上一结点相连,且使p2指向新建立的结点。指向新建立的结点。建立新结点:建立新结点:p1=(structstudent*)malloc(sizeof(structstud
32、ent);scanf(%d%f,&p1-num,&p1-score);如图如图8-6(a)所示:所示:与上一结点线连:与上一结点线连:p2-next=p1;如图如图8-6(b)所示:所示:使使p2指向新链结点:指向新链结点:p2=p1;如图如图8-6(c)所示:所示:8-6(a)8-6(b)8-6(c)第8章 结构体共用体与枚举类型 31 重重复复执执行行第第(3)步步,可可以以建建立立第第三三个个结结点点,并并使使第第三三个个结结点点和和第第二二个个结结点点链链接接(p2-next=p1;),依依次次创创建建后后面面的的结结点,直到所有的结点建立完毕。点,直到所有的结点建立完毕。(4)为末结
33、点的指针域赋值)为末结点的指针域赋值NULL(p2-next=NULL;)8.4.5动态链表的建立动态链表的建立 第8章 结构体共用体与枚举类型 32例例8-7建立有建立有n个个student类型结点的链表,类型结点的链表,n的值从键盘输入,再输出链表。的值从键盘输入,再输出链表。#defineNULL0#defineLENsizeof(structstudent)#include#include/*定义结点定义结点*/structstudentintnum;floatscore;structstudent*next;/*main函数中,分别调用函数中,分别调用create和和print函数建
34、立和输出链表函数建立和输出链表*/voidmain()intn;structstudent*head;structstudentcreate(intn);/*函数声明函数声明*/voidprint(structstudent*head);/*函数声明函数声明*/printf(pleaseinputnn);scanf(%d,&n);head=create(n);print(head);第8章 结构体共用体与枚举类型 33/*create(intn)函数函数:创建一个具有头结点的单链表创建一个具有头结点的单链表*/*形参形参n值:创建链表的结点数值:创建链表的结点数*/*返回值:返回单链表的头指针
35、返回值:返回单链表的头指针*/structstudent*create(intn)inti;structstudent*head=NULL,*p1,*p2;head=p2=(structstudent*)malloc(LEN);/*申请一个新结点的空间申请一个新结点的空间*/scanf(%d%f,&p2-num,&p2-score);/*读入数据读入数据*/for(i=2;inum,&p1-score);p2-next=p1;/*与上一结点相链与上一结点相链*/p2=p1;/*使使p2指向新链结点指向新链结点*/p2-next=NULL;return(head);例例8-7建立有建立有n个个s
36、tudent类型结点的链表,类型结点的链表,n的值从键盘输入,再输出链表。的值从键盘输入,再输出链表。第8章 结构体共用体与枚举类型 34/*voidprint(structstudent*head)为链表输出函数为链表输出函数*/*形参形参head为要输出链表的头指针为要输出链表的头指针*/voidprint(structstudent*head)structstudent*p;p=head;while(p!=NULL)printf(%d,%6.1fn,p-num,p-score);p=p-next;/*移动指针移动指针*/例例8-7建立有建立有n个个student类型结点的链表,类型结点的
37、链表,n的值从键盘输入,再输出链表。的值从键盘输入,再输出链表。第8章 结构体共用体与枚举类型 358.4.6链表的删除操作链表的删除操作 下面讨论在结点类型为下面讨论在结点类型为student的链表中删除的链表中删除num域为某域为某个值的结点的主要操作步骤(链表结点为个值的结点的主要操作步骤(链表结点为structstudent类型类型数据结构):数据结构):设三个指针变量:设三个指针变量:head、p1、p2,它们都是用来指向,它们都是用来指向structstudent类型数据的,类型数据的,head指向链表头,若指向链表头,若head=NULL,则链表为空,没有可删除结点。,则链表为空
38、,没有可删除结点。查找要删除的结点,使查找要删除的结点,使p1指向它,指向它,p2指向指向p1的前一结点(前的前一结点(前驱)。有两种情况:删除首结点和其它结点。驱)。有两种情况:删除首结点和其它结点。(1)删除首结点)删除首结点使使p1指向第一个结点,用以下语句实现删除首结点操作。指向第一个结点,用以下语句实现删除首结点操作。p1=head;head=p1-next;free(p1);第8章 结构体共用体与枚举类型 368.4.6链表的删除操作链表的删除操作(2)删除其它结点)删除其它结点 删除链表的中间结点通过将下一结点地址赋给前一结点地删除链表的中间结点通过将下一结点地址赋给前一结点地址
39、来实现,也即将要删除的址来实现,也即将要删除的p1结点的后继地址,放入前一结结点的后继地址,放入前一结点点p2的地址域(的地址域(p2-next=p1-next;),同时释放),同时释放p1结点。结点。/*该函数的功能是从表头指针为该函数的功能是从表头指针为head的链表中删除的链表中删除num域域的值与形参的值与形参num相等的结点,释放该结点的存储空间,返回相等的结点,释放该结点的存储空间,返回该链表的表头指针。该链表的表头指针。*/第8章 结构体共用体与枚举类型 37structstudent*delete(structstudent*head,intnum)structstudent*
40、p1,*p2;if(head=NULL)printf(listnull!n);elsep1=head;while(p1!=NULL&p1-num!=num)/*while循环查找删除结点循环查找删除结点*/p2=p1;p1=p1-next;/*后移一个结点后移一个结点*/if(p1-num=num)/*找到了找到了*/if(p1=head)head=p1-next;/*删除头结点删除头结点*/elsep2-next=p1-next;/*删除中间结点删除中间结点*/free(p1);elseprintf(%dnotbeenfound!n,num);return(head);8.4.6链表的删除操
41、作链表的删除操作 第8章 结构体共用体与枚举类型 388.4.7链表的插入操作链表的插入操作 下面讨论在结点类型为下面讨论在结点类型为student的链表中插入一个新生结点的的链表中插入一个新生结点的主要操作步骤(链表结点为主要操作步骤(链表结点为structstudent类型数据结构):类型数据结构):先设四个指针变量先设四个指针变量head、p0、p1、p2:head:要插入链表的头指针。要插入链表的头指针。P0:指向要插入的结点。指向要插入的结点。P1:指向当前结点,首先使指向当前结点,首先使p1指向头结点(指向头结点(p1=head)。)。P2:指向前一结点(即指向前一结点(即P1原来
42、指向的结点)。原来指向的结点)。首先查找插入的位置,应插入的位置:首先查找插入的位置,应插入的位置:p1之前,之前,p2之后。之后。在链表中,各结点按成员在链表中,各结点按成员score(成绩)由小到大顺序存放,从(成绩)由小到大顺序存放,从第一个结点开始,把待插入结点第一个结点开始,把待插入结点p0-score与每一个结点与每一个结点p1-score比较,若比较,若(p0-score)(p1-score),则,则p1移到下一个结点移到下一个结点(p1=p1-next),同时,),同时,p2也移到下一个位置(也移到下一个位置(p2=p1)。)。第8章 结构体共用体与枚举类型 39(1)原链表为
43、空表)原链表为空表 即即head=NULL时,时,用以下语句实现插入操作:用以下语句实现插入操作:head=p0;p0-next=NULL;p0是该链表惟一一个结点。是该链表惟一一个结点。(2)在头结点之前插入)在头结点之前插入 当当p0-scorescore时,若时,若p1=head,表示插入结点在,表示插入结点在头结点之前。用以下语句实现插入操作:头结点之前。用以下语句实现插入操作:head=p0;p0-next=p1;8.4.7链表的插入操作链表的插入操作 插入前插入后 第8章 结构体共用体与枚举类型 408.4.7链表的插入操作链表的插入操作(3 3)在非头结点之前,非尾节点之后插入)
44、在非头结点之前,非尾节点之后插入 当当p0-scorescorep0-scorescore,且,且p1headp1head时,表示在在非头时,表示在在非头结点之前,非尾节点之后(中间结点)插入结点,用以下语句结点之前,非尾节点之后(中间结点)插入结点,用以下语句实现插入操作:实现插入操作:p2-next=p0;p0-next=p1;p2-next=p0;p0-next=p1;插入前插入后 第8章 结构体共用体与枚举类型 418.4.7链表的插入操作链表的插入操作(4)尾节点之后插入)尾节点之后插入 当当p0-scorep1-score时,表示在尾节点之后插入结点,时,表示在尾节点之后插入结点,
45、用以下语句实现插入操作:用以下语句实现插入操作:p1-next=p0;p0-next=NULL;插入前插入后 第8章 结构体共用体与枚举类型 42函数函数insert的功能是:在一个有序链表中插入一个结点。的功能是:在一个有序链表中插入一个结点。在链表在链表head中,插入中,插入stud结点,并返回新链表的表头结点,并返回新链表的表头structstudent*insert(structstudent*head,structstudent*stud)structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)/*原链表是空表原链表是空表*/he
46、ad=p0;p0-next=NULL;else/*while循环查找待插入的位置循环查找待插入的位置*/while(p0-scorep1-score)&(p1-next!=NULL)p2=p1;p1=p1-next;/*后移一个结点后移一个结点*/if(p0-scorescore)if(p1=head)/*在表头结点插入在表头结点插入*/head=p0;p0-next=p1;else/*在中间结点插入在中间结点插入*/p2-next=p0;p0-next=p1;else/*在尾结点之后插入在尾结点之后插入*/p1-next=p0;p0-next=NULL;return(head);第8章 结构
47、体共用体与枚举类型 43union共用体名共用体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.;例例uniondatainti;floatf;charch;fchi1.1.共用体类型定义共用体类型定义定义形式:定义形式:v构造数据类型构造数据类型,也叫联合体也叫联合体v用途:使几个不同类型的变量共占一段内存用途:使几个不同类型的变量共占一段内存(相互覆盖相互覆盖)8.5共用体共用体 第8章 结构体共用体与枚举类型 44形式一:union data int i;char ch;float f;a,b;形式二:union data int i;char ch;floa
48、t f;union data a,b,c;形式三:union int i;char ch;float f;a,b,c;2.2.共用体变量的定义共用体变量的定义fchifchiab8.5共用体共用体v共用体共用体变量定义分配内存长度变量定义分配内存长度=最长成员最长成员所占字节数所占字节数 第8章 结构体共用体与枚举类型 458.5共用体共用体v共用变量的引用与结构变量一样,也只能逐个引用共用变量共用变量的引用与结构变量一样,也只能逐个引用共用变量的成员。的成员。例如,访问共用变量例如,访问共用变量un1un1各成员的格式为:各成员的格式为:un1.iun1.i、un1.un1.chch、un1
49、.fun1.f。对共用体变量的使用需要注意如下几个问题:对共用体变量的使用需要注意如下几个问题:(1)系系统统采采用用覆覆盖盖技技术术,实实现现共共用用变变量量各各成成员员的的内内存存共共享享,所所以在某一时刻,存放的和起作用的是最后一次存入的成员值。以在某一时刻,存放的和起作用的是最后一次存入的成员值。(2)由由于于所所有有成成员员共共享享同同一一内内存存空空间间,故故共共用用变变量量与与其其各各成成员员的地址相同。的地址相同。(3)不不能能对对共共用用变变量量进进行行初初始始化化(注注意意:结结构构变变量量可可以以);也也不不能能将将共共用用变变量量作作为为函函数数参参数数,以以及及使使函
50、函数数返返回回一一个个共共用用数数据据,但但可以使用指向共用变量的指针。可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。)共用类型可以出现在结构类型定义中,反之亦然。第8章 结构体共用体与枚举类型 46例例8-9 8.5共用体共用体 假假设设一一个个学学生生的的信信息息表表中中包包括括学学号号、姓姓名名和和一一门门课课的的成成绩绩。而而成成绩绩通通常常又又可可采采用用两两种种表表示示方方法法:一一种种是是五五分分制制,采采用用的的是是整整数数形形式式;另另一一种种是是百百分分制制,采采用用的的是是浮浮点点数数形形式式,现现要要求编一程序,输入一个学生的信息并显示出