《第结构体联合体和枚举类型.pptx》由会员分享,可在线阅读,更多相关《第结构体联合体和枚举类型.pptx(105页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章目录返回本章目录7.1 7.1 结构体结构体结构体结构体结构体与结构变量结构体与结构变量结构成员的引用结构成员的引用结构数组结构数组结构指针与链表结构指针与链表第1页/共105页结构体与结构变量结构体与结构变量结构体与结构变量结构体与结构变量 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返
2、回本节目录 “结构体”是一种构造类型,是由数目固定,类型相同或不同的若干有序变量组成的集合。组成结构体的每个数据都称为结构体的“成员”,或称“分量”。返回本节目录返回本节目录1结构体类型的声明结构体类型的声明2结构变量的定义结构变量的定义3结构体类型与结构变量结构体类型与结构变量第2页/共105页1 1结构体类型的声明结构体类型的声明结构体类型的声明结构体类型的声明 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录 声明一个结构体类型的一般形式为:struct
3、成员表列(也称为域表);应注意在括号后的分号是不可少的。成员表列由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式为:;成员名的命名应符合C语言标识符的书写规定,结构体成员名可与程序中其它变量同名,互不干扰。第3页/共105页2 2结构变量的定义结构变量的定义结构变量的定义结构变量的定义 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录 对于已经声明的结构体类型,就可有对应于该类型的“结构类型变量”,简称为“结构变量”。定义
4、结构变量有以下三种方法:(1)先声明结构体类型,再定义结构变量 即在先前声明的结构体类型后加上以下形式:struct ;(2)在声明结构体类型的同时定义结构变量 即被定义的结构变量直接在结构体类型声明的“”后给出。一般形式为:struct 成员表列 结构变量表列;(3)直接定义结构变量 即省略结构体名。一般形式为:struct ;第4页/共105页3 3结构体类型与结构变量结构体类型与结构变量结构体类型与结构变量结构体类型与结构变量 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境
5、境)返回目录返回目录 结构体类型与结构变量的最大区别在于:结构变量占有一定的内存空间,而结构体类型只是一种数据类型的结构描述,并不占用内存空间。struct box float length;float width;float height;它表明struct box结构体类型由大括号中所列的一些数据项组成,共需占用4x3=12个字节。在此之后,若进行结构变量的定义如:struct box box1;表明box1为struct box结构体类型变量,它占用了12个字节的内存单元。第5页/共105页结构成员的引用结构成员的引用结构成员的引用结构成员的引用 C C C C C C语语语言言言程程程
6、序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录 对结构变量的访问是通过对结构变量各个成员的访问来进行的,结构变量成员描述为:.在引用中应遵循以下原则:(1)如果成员本身又是一个结构体类型时,则必须逐级找到最低一级的成员才能使用。(2)对成员变量的使用与普通变量完全相同,可根据其类型进行相应的运算。(3)可以引用成员的地址,也可以引用结构体变量的地址。(4)允许将一个结构变量直接赋值给另一个具有相同结构的结构变量。【例例7.1】第6页/共105页例例例例7.17.1(1 1)C C C C C
7、 C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录【例7.1】利用结构体对三名学生的学号、姓名、性别、成绩进行输入与输出。程序名为l7_1.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student1,student2=960002,Zhang hong li,W,98,student3;/*对student2初始化*/main()student1.num=960001;/
8、*对student1各成员赋值*/scanf(%s,student1.name);student1.sex=M;student1.score=65;student3=student1;/*对student3直接赋值*/第7页/共105页例例例例7.17.1(2 2接上页)接上页)接上页)接上页)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录printf(n%ldt%20st%ct%f,student1.num,student1.name,student1.se
9、x,student1.score);printf(n%ldt%20st%ct%f,student2.num,student2.name,student2.sex,student2.score);printf(n%ldt%20st%ct%f,student3.num,student3.name,student3.sex,student3.score);运行情况如下:输入:Lilin960001 Lilin M 65960002 Zhang hong li W 98960001 Lilin M 65程序演示程序演示第8页/共105页 例例例例7.17.1程序演示程序演示程序演示程序演示返回例题返回
10、例题返回目录返回目录第9页/共105页结构数组结构数组结构数组结构数组 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录数组元素是结构体类型数据,这时的数组就是结构数组。1结构数组的定义结构数组的定义2.结构数组的初始化结构数组的初始化【例例7.2】第10页/共105页1 1结构数组的定义结构数组的定义结构数组的定义结构数组的定义 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6
11、 66.0 00环环环环环环境境境境境境)返回目录返回目录结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。例如:struct stu int num;char name20;char sex;float score;struct stu student3;也可以直接定义一个结构数组或省略结构体名。第11页/共105页2.2.结构数组的初始化结构数组的初始化结构数组的初始化结构数组的初始化 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录 对结构数组可
12、以进行初始化,它的作用在于把成批的数据传递给结构数组中的各个元素。初始化的一般形式为:struct n=;其中,n为元素的个数。在初始表列中,以一个元素内容为单位,用一对“”括起来,各元素之间用“,”分隔。当对数组中的全部元素初始化时,也可将“”中的数组元素个数省略。在编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。数组的初始化也可以先声明结构体类型,然后再定义数组为该结构体类型,并在定义数组时初始化。第12页/共105页【例例例例7.27.2】(1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+
13、6 66.0 00环环环环环环境境境境境境)返回目录返回目录【例7.2】计算学生的平均成绩并统计出不及格的人数。程序名为l7_2.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liu ying,W,50;main()int i,n;float average,sum;n=0;sum=0;第13页/共105页【例例例例7.27.2】(2 2上接上接上接上接1 1)C C C C C
14、 C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录for(i=0;i3;i+)sum+=studenti.score;if(studenti.score60)n+=1;printf(sum=%fn,sum);average=sum/3;printf(average=%fncount=%dn,average,n);运行情况如下:sum=234.000000average=78.000000count=1.程序演示程序演示第14页/共105页【例例例例7.27.2】程序演示程序演示程序
15、演示程序演示返回例题返回例题返回目录返回目录第15页/共105页结构指针与链表结构指针与链表结构指针与链表结构指针与链表 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1结构指针2链表链表第16页/共105页1 1结构指针结构指针结构指针结构指针 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录 我们把指向结构体的指针称
16、为结构指针,它是一个指针变量。结构指针变量说明的一般形式为:struct *;这样说明的含义是:一规定了指针的数据特性;二为结构指针本身分配了一定的内存空间。结构指针变量必须要先赋值后才能使用,赋的值应是一个地址值。有了结构指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为:.或为:-第17页/共105页1 1结构指针结构指针结构指针结构指针 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回目录返回目录在结构指针的使用中可分为以下几种情况:(3)结构指针作函数
17、参数结构指针作函数参数(1)指向结构变量指向结构变量(2)指向结构数组指向结构数组第18页/共105页(1)(1)指向结构变量指向结构变量指向结构变量指向结构变量 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回1 1目录目录 当使用结构指针指向一个结构变量时,指针变量中的值就是所指向的结构变量的首地址。这三种用于表示结构成员的形式是完全等效的。结构变量.成员名 (*结构指针变量).成员名 结构指针变量-成员名 请注意分析下面几种运算:s-n 得到s指向的结构变量中的成
18、员n的值 s-n+得到s指向的结构变量中的成员n的值,用完该值后使 它加1 +s-n 得到s指向的结构变量中的成员n的值使之加1【例例7.3】第19页/共105页【例例例例7.37.3】(1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(1)(1)【例7.3】通过结构指针引用结构体成员。程序名为l7_3.cpp。#include stdio.hstruct stu int num;char name20;char sex;float score;student1
19、=102,Zhang ping,M,78.5,*s;main()s=&student1;/*给结构指针变量赋值*/printf(Number=%dtName=%st,student1.num,student1.name);printf(Sex=%ctScore=%fn,student1.sex,student1.score);printf(Number=%dtName=%st,(*s).num,(*s).name);printf(Sex=%ctScore=%fn,(*s).sex,(*s).score);printf(Number=%dtName=%st,s-num,s-name);print
20、f(Sex=%ctScore=%fn,s-sex,s-score);第20页/共105页【例例例例7.37.3】(2 2上接上接上接上接1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(1)(1)运行情况如下:Number=102Name=Zhang pingSex=MScore=78.500000Number=102Name=Zhang pingSex=MScore=78.500000Number=102Name=Zhang pingSex=MScore=78
21、.500000程序演示程序演示第21页/共105页【例例例例7.37.3】程序演示程序演示程序演示程序演示返回例题返回例题返回返回(1)(1)第22页/共105页(2)(2)指向结构数组指向结构数组指向结构数组指向结构数组 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回1 1目录目录 当结构指针指向一个结构数组时,该指针变量的值是整个结构数组的首地址。当然结构指针也可以指向结构数组中的某个元素,这时指针变量的值是该结构数组元素的首地址。设s为指向结构数组的指针变量,则
22、s也指向该结构数组的0号元素,s+1指向1号元素,s+i则指向i号元素。【例例7.4】第23页/共105页【例例例例7.47.4】(1)(1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)【例7.4】用指针变量输出结构数组。程序名为l7_4.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,20000
23、2,Wang hai,M,85,200003,Liuying,W,50;main()struct stu*s;printf(NumtNamettSextScoretn);for(s=student;snum,s-name,s-sex,s-score);第24页/共105页【例例例例7.47.4】(2(2上接上接上接上接1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)运行情况如下:NumNameSexScore200001 Li li W99.0000
24、00200002 Wang haiM85.000000200003 Liuying W50.000000.程序演示程序演示第25页/共105页【例例例例7.47.4】程序演示程序演示程序演示程序演示返回例题返回例题返回返回(2)(2)第26页/共105页(3)(3)结构指针作函数参数结构指针作函数参数结构指针作函数参数结构指针作函数参数 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)使用结构指针,即用指向结构变量(或数组)的结构指针作函数参数进行传送,这时由实参向形参传递的是
25、地址,属于“地址传递”方式,减少了时间和空间上的开销。【例例7.5】返回返回1 1目录目录第27页/共105页【例例例例7.57.5】(1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(3)(3)【例7.5】用结构指针变量作函数参数编程,计算一组学生的平均成绩并统计出不及格人数。程序名为l7_5.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student
26、3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liuying,W,50;void average(struct stu*ps)int n=0,i;float ave,s=0;第28页/共105页【例例例例7.57.5】(2 2上接上接上接上接1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(3)(3)for(i=0;iscore;if(ps-scorenum=102;strcpy(s-name,Zhang pin
27、g);s-sex=M;s-score=62.5;printf(Number=%dnName=%sn,s-num,s-name);printf(Sex=%cnScore=%fn,s-sex,s-score);free(s);运行情况如下:Num=102Name=Zhang pingSex=MScore=62.500000 程序演示程序演示第37页/共105页 【例例例例7.67.6】程序演示程序演示程序演示程序演示返回例题返回例题返回返回(1)(1)目录目录第38页/共105页(2)(2)链表的使用链表的使用链表的使用链表的使用 C C C C C C语语语言言言程程程序序序设设设计计计 (V
28、VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回2 2目录目录 链表是一种常见的、重要的数据结构,它采用动态的分配办法为一个结构体分配内存空间。一方面需要时就分配一块空间用来存放,从而节约了宝贵的内存资源;且便于删除与加入。另一方面,在动态分配时,每个结点之间可以是不连续的(结点内是连续的),结点之间的联系是通过指针来实现的,即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放第三个结点的首地址,如此串连下去直到最后
29、一个结点。最后一个结点因无后续结点连接,其指针域可赋为NULL。这样一种连接方式,如同一条一环接一环的链子,在数据结构中称之为“链表”。第39页/共105页(2)(2)链表的使用链表的使用链表的使用链表的使用 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回2 2目录目录例如,一个存放学生学号和成绩的结点可以定义为以下结构:struct stu int num;int score;struct stu*next;在该结构体中前两个成员项组成数据域,最后一个成员项next
30、构成指针域,它是一个指向struct stu类型的结构指针变量。对链表的基本操作主要有:建立链表链表的输出 链表的删除操作链表的插入操作【例7.11】第40页/共105页 建立链表建立链表建立链表建立链表 (1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)建立链表就是指从无到有地建立起一个链表,即一个个地输入各结点数据,并建立起前后相链的关系。【例7.7】编写一个建立单向链表的函数,存放学生数据。函数create可编写如下:#include stdio.h#includ
31、e malloc.h#define NULL 0 /*令NULL为0,用它表示空地址*/#define LEN sizeof(struct stu)/*LEN代表struct stu结构体类型数据的长度*/struct stu long int num;float score;struct stu*next;返回返回(2)(2)目录目录第41页/共105页 建立链表建立链表建立链表建立链表 (2 2上接上接上接上接1 1)C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回
32、(2)(2)目录目录int n;struct stu*creat()/*此函数带回一个指向链表头的指针*/struct stu*head,*p1,*p2;n=0;/*n为结点的个数*/p1=p2=(struct stu*)malloc(LEN);/*开辟一个新单元*/scanf(%ld,%f,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;else p2-next=p1;第42页/共105页 建立链表(建立链表(建立链表(建立链表(3 3上接上接上接上接2 2)C C C C C C语语语言言言程程程序序序设设
33、设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)目录目录p2=p1;p1=(struct stu*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);p2-next=NULL;return(head);/*返回链表的头地址*图7-7、图7-8、图7-9、图7-10、图7-11表示出creat函数的执行过程。第43页/共105页图7-7返回返回第44页/共105页图7-8返回返回第45页/共105页图7-9(a)返回返回第46页/共105页图7-9(b)返回返回第47页/
34、共105页图7-9(c)返回返回第48页/共105页图7-10(a)返回返回第49页/共105页图7-10(b)返回返回第50页/共105页图7-10(c)返回返回第51页/共105页图7-11返回返回第52页/共105页链表的输出链表的输出链表的输出链表的输出 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)目录目录将链表中各结点的数据依次输出,首先要知道链表头元素的地址。设一个指针变量p,指向第一个结点,待输出p所指的结点数据后,使p后移一个结点再输出,
35、直至链表的尾结点止。程序执行过程可见图7-12所示。【例7.8】写一个函数,输出链表中所有结点。void print(head)/*由实参即将已有的链表的头指针传给被调函数*/struct stu*head;struct student*p;printf(n Now,these%d records are:n,n);p=head;/*p指向头结点*/while(p!=NULL)printf(%ld,%fn,p-num,p-score);/*输出所指结点的数据域*/p=p-next;/*使p指向下一个结点*/第53页/共105页图7-12返回返回第54页/共105页链表的删除操作链表的删除操作链
36、表的删除操作链表的删除操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)目录目录 从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来,可以通过改变链表的链接关系完成。分析:设两个指针变量p1和p2,先使p1指向第一个结点。删除一个结点有两种情况:一种情况是要删除结点是第一个结点,此时只需使head指向第二个结点即可,即head=p1-next,其过程如图7-13所示。另一种情况是被删除结点不是第一个结点,可使被删除结点的前一结
37、点指向被删结点的后一结点,即p2-next=p1-next,其过程如图7-14所示。【例7.9】写一个函数,删除链表中的指定结点,以指定的学号作为删除结点的标志。函数dele编写如下:struct stu *dele(struct stu*head,long int num)struct stu *p1,*p2;第55页/共105页链表的删除操作链表的删除操作链表的删除操作链表的删除操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)if(head=NULL)/*如为空表,输
38、出提示信息*/printf(nempty list!n);goto end;p1=head;while(p1-num!=num&p1-next!=NULL)/*当不是要删除的结点,而且也不是最后一个结点时,继续循环*/p2=p1;p1=p1-next;/*后移一个结点*/if(p1-num=num)/*找到要删除的结点*/if(p1=head)head=p1-next;/*为第一结点head指向第二结点*/else p2-next=p1-next;/*不是第一个结点,使要删除结点从链表中脱离*/返回返回(2)(2)目录目录第56页/共105页链表的删除操作链表的删除操作链表的删除操作链表的删除
39、操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)n=n-1;free(p1);else printf(The node not been foud!n);end:return head;/*返回head值*/返回返回(2)(2)目录目录第57页/共105页图7-13返回返回第58页/共105页图7-14(a)返回返回第59页/共105页图7-14(b)返回返回第60页/共105页图7-14(c)返回返回第61页/共105页链表的插入操作链表的插入操作链表的插入操作链表的插
40、入操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)在一个链表的指定位置插入结点,首先要求链表本身必须是已按某种规律排好序的。按照排序的规律确定好新结点在链表中的位置,并将其连入链表中即可。分析:设被插入结点的指针为p0,p1指向第一个结点。可在四种不同情况下插入:第一种情况是原链表是空链表,只需使head指向被插入结点即可,见图7-15(a)。第二种情况是被插入结点值最小,则应插入到第一个结点之前。这种情况下使head指向被插入结点,被插入结点的指针域指向原来的第一个结点
41、即可,即用p0-next=p1;head=p0;完成,见图7-15(b)。第三种情况是在其它位置插入,见图7-15(c)。这种情况下,使插入位置的前一结点的指针域指向被插入结点,使被插入结点的指针域指向插入位置的后一结点,即用p0-next=p1;p2-next=p0;来完成。返回返回(2)(2)目录目录第62页/共105页链表的插入操作链表的插入操作链表的插入操作链表的插入操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)最后一种情况是在表末插入,见图7-15(d)。这种
42、情况下使原链表中的末结点指针域指向被插入结点,被插入结点指针域置为NULL。即用p1-next=p0p0-next=NULL;来完成。【例7.10】写一个函数,在学生数据链表中,按学号顺序插入一个结点。struct stu*insert(struct stu*head,struct stu*stud)struct stu *p0,*p1,*p2;p1=head;/*指向第一个结点*/p0=stud;/*指向要插入的结点*/if(head=NULL)/*空表插入*/head=p0;p0-next=NULL;/*将p0指向的结点作第一个结点*/返回返回(2)(2)目录目录第63页/共105页链表的
43、插入操作链表的插入操作链表的插入操作链表的插入操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)else while(p0-nump1-num)&(p1-next!=NULL)p2=p1;p1=p1-next;/*找插入位置*/if(p0-numnum)if(head=p1)head=p0;/*在第一结点之前插入*/else p2-next=p0;/*在其它位置插入*/p0-next=p1;返回返回(2)(2)目录目录第64页/共105页链表的插入操作链表的插入操作链表的插
44、入操作链表的插入操作 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)else p1-next=p0;p0-next=NULL;/*在表末插入*/n=n+1;return(head);返回返回(2)(2)目录目录第65页/共105页图7-15(a)返回返回第66页/共105页图7-15(b)返回返回第67页/共105页图7-15(c)返回返回第68页/共105页图7-15(d)返回返回第69页/共105页【例例例例7.117.11】C C C C C C语语语言言言程程程序序序
45、设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回(2)(2)目录目录【例7.11】将以上建立链表、输出链表、删除结点、插入结点的函数组 织 在 一 个 程 序 中,用 main函 数 作 主 调 函 数。程 序 名 为l7_7891011.cpp。main函数内容如下:(其位置在以上各函数之后)#include stdio.hmain()struct stu *head,stud;long int num;printf(input records:n);head=creat();/*调用creat函数建立链表并把头
46、指针返回给head*/print(head);/*调用print函数输出链表*/printf(Input the deleted number:);scanf(“%ld”,&num);/*输入待删结点的学号*/head=dele(head,num);/*调用dele函数删除一个结点*/第70页/共105页【例例例例7.117.11】C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)print(head);/*调用print函数输出链表*/printf(Input the inse
47、rted number and score:);scanf(%ld,%f,&stud.num,&stud.score);/*输入待插入结点的数据域值*/head=insert(head,&stu);/*调用insert函数插入pnum所指的结点*/print(head);/*再次调用print函数输出链表*/运行情况如下:input records:输入:96001,85 96002,75.296005,620,0返回返回(2)(2)目录目录第71页/共105页【例例例例7.117.11】C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal
48、ll C CC+6 66.0 00环环环环环环境境境境境境)Now,these 3 records are:96001,85.00000096002,75.19999796005,62.000000Input the deleted number:输入:96002 Now,these 2 records are:96001,85.00000096005,62.000000Input the insert number and score:输入:96004,78 Now,these 3 records are:96001,85.00000096004,78.00000096005,62.0000
49、00程序演示程序演示返回返回(2)(2)目录目录第72页/共105页【例例例例7.117.11】程序演示程序演示程序演示程序演示返回例题返回例题返回本节目录返回本节目录第73页/共105页 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章目录返回本章目录7.2 7.2 联合体联合体联合体联合体联合体和联合变量联合体和联合变量联合体的引用及特点联合体的引用及特点 在C语言中,把这种将几种不同类型的变量存放在同一段内存单元中的结构称为“联合体”,也称为“共用体”。“联合体”
50、与“结构体”有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。【例例7.12】第74页/共105页联合体和联合变量联合体和联合变量联合体和联合变量联合体和联合变量 C C C C C C语语语言言言程程程序序序设设设计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1联合体类型的声明2联合变量的定义联合变量的定义第75页/共105页1 1联合体类型的声明联合体类型的声明