




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 结构与共用杨丽波 朱迅 汤承林 编著刘长荣 主审本章目标v理解为什么使用结构与共用v掌握结构和结构变量的定义方法v结构变量的赋值和引用、结构数组和指向结构变量的指针的用法v共用的概念和共用变量的引用v动态存储分配的方法为什么要使用结构v例如:存储一个班级中5名同学的信息:学号、姓名、性别、年龄。1.使用数组存储?张三李四王五钱六赵四FMFMF01020304052323243221 “结构” 是一种构造数据类型,它是由若干数据类型的数据项组合而成的复杂数据对象,这些数据项称为结构的成员。10.1 结构与结构变量10.1.1结构的定义结构的定义 在在C语言中,结构是一种由不同数据类型的变
2、量组成的集合。组成语言中,结构是一种由不同数据类型的变量组成的集合。组成结构的变量称为结构元素或结构成员。结构的变量称为结构元素或结构成员。 结构定义的一般形式为:结构定义的一般形式为: struct 结构名结构名 数据类型数据类型 成员名成员名1; 数据类型数据类型 成员名成员名2; 数据类型数据类型 成员名成员名n; ; 其中,其中,struct是关键字,每个结构都可以含有多个不同类型的成员,是关键字,每个结构都可以含有多个不同类型的成员,结构中的成员也称结构中的元素,结构定义以分号结构中的成员也称结构中的元素,结构定义以分号“;”结束。结束。定义结构struct studentint i
3、d;char name20;char sex;int age;结构成员结构名C 语言中的有效数据类型 结构定义放置在程序的开始部分,位于头文件声明之后 结构定义并不预留内存,结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。结构变量的定义struct student int num; char name20; char sex; int age; ;2.在定义结构类型的同时定义结构变量在定义结构类型的同时定义结构变量 1.先定义结构,再定义结构变量先定义结构,再定义结构变量 struct student stu1,stu2;stu1,stu2;3.直接定义结构变量直接定
4、义结构变量 结构变量的内存分配v声明一个结构变量以后,将会为该变量分配内存,声明一个结构变量以后,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。大小是大于或等于其所有成员变量的大小之和。图图10-1 结构变量的存储形式结构变量的存储形式 struct student int id; char name20; char sex; int age;嵌套结构的定义struct birthday int month; int day; int year;struct student int id; char name20; char sex; struct birthday birt
5、h;stu1,stu2; 在结构在结构student中定义的成员中定义的成员birth是结构是结构birthday类型的变量。类型的变量。 注意:在一个结构类型的定义中包含的另一种结构类型必须是已经注意:在一个结构类型的定义中包含的另一种结构类型必须是已经定义的。定义的。结构变量的引用与赋值一般有两种方式引用结构变量成员:一般有两种方式引用结构变量成员:1.使用成员运算符:结构变量名使用成员运算符:结构变量名.成员名成员名例如:例如:stu1.id stu2.sex对于嵌套结构成员,必须逐级找到最低级的成员。对于嵌套结构成员,必须逐级找到最低级的成员。例如:例如:stu1.birth.mont
6、h stu1.birth.year2.使用指针访问结构变量的成员:结构指针变量名使用指针访问结构变量的成员:结构指针变量名-成员名成员名例如:例如:struct student stu,*p; p=&stu; p-id=1;结构成员的赋值 可以使用输入语句或赋值语句来给结构变量的各个成员赋值:可以使用输入语句或赋值语句来给结构变量的各个成员赋值: 例如:例如: =“王五王五”; /使用赋值语句为成员赋值使用赋值语句为成员赋值 stu1.sex=M; 或者:或者: printf(“请输入请输入年龄年龄:n); scanf(“%f”,&stu1.age); /使用
7、输入语句赋值使用输入语句赋值 或者:或者: stu2 = stu1; /将将stu1的各成员的值分别赋给的各成员的值分别赋给stu2的各成员的各成员结构变量的引用与赋值#includevoid main()struct studentint id;char name9;int age;char sex;struct student stu1;printf(请输入学号、姓名、年龄、性别请输入学号、姓名、年龄、性别:n); scanf(%d%s%d,&stu1.id,,&stu1.age); getchar(); stu1.sex=getchar(); print
8、f(“学号学号:%d 姓名姓名:%s 年龄年龄:%d 性别性别:%cn,stu1.id,,stu1.age,stu1.sex);例例10.1 编写程序,使用结构变量存储一个学生的信息并输出编写程序,使用结构变量存储一个学生的信息并输出结构变量的引用与赋值【注意】【注意】(1)结构类型可以定义在主函数之外,也可以定义主函数之内。)结构类型可以定义在主函数之外,也可以定义主函数之内。(2)在)在scanf()语句中()语句中不能加不能加“&”,因为,因为name是字符数组,是字符数组,name本身表示数组的首地址。本身表示数组的首地址。(3)使用)使用s
9、canf()输入字符串时,中间不能有空格。可以使用输入字符串时,中间不能有空格。可以使用gets()输入,要以回车符结束输入。输入,要以回车符结束输入。(4)语句)语句getchar();表示接收输入年龄的值后输入的间隔符,语句表示接收输入年龄的值后输入的间隔符,语句stu1.sex=getchar();将输入的性别的值赋给结构成员将输入的性别的值赋给结构成员sex。结构变量的初始化结构变量与其他类型变量一样,可以在定义的时候进行初始化。结构变量与其他类型变量一样,可以在定义的时候进行初始化。例如:例如: struct student int id; char name20;
10、 int age; char sex;注意:注意: 1.初始化数据的顺序要与定义结构类型时成员的顺序一致。初始化数据的顺序要与定义结构类型时成员的顺序一致。 2.初始化数据的数量可以比定义结构类型时成员的数量少。初始化数据的数量可以比定义结构类型时成员的数量少。结构变量的初始化#includestruct student int id; char name9; int age; char sex; int score3;stu1=2,李明李明,22,m,92,85,88;void main() printf(学号:学号:%d 姓名:姓名:%s 年龄:年龄:%d 性别:性别:%c ,stu1.i
11、d, ,stu1.age,stu1.sex); printf(成绩是:成绩是:); for(int i=0;i3;i+) printf(%d ,stu1.scorei); printf(n); 【例【例10-210-2】初始化结构变量后输出每个成员的值。】初始化结构变量后输出每个成员的值。结构变量的初始化程序的运行结果如图程序的运行结果如图10-3所示:所示: 图图10-3 例例10-2运行结果运行结果10.2 结构数组1.结构数组的定义结构数组的定义例如:例如: struct student int id; char name20; /定义含义三个元素的结构数组,分别定义含
12、义三个元素的结构数组,分别 char sex; /是是stud1、stud2、stud3 int age; stud3; q 数组中的元素都是同一种结构类型的变量,称为结构数组。数组中的元素都是同一种结构类型的变量,称为结构数组。q 在许多实际应用中,经常使用结构数组来表示具有相同数据结构和特在许多实际应用中,经常使用结构数组来表示具有相同数据结构和特征的一个群体,例如一个班级学生的信息、一个部门成员的档案等等。征的一个群体,例如一个班级学生的信息、一个部门成员的档案等等。10.2 结构数组2.结构数组的初始化结构数组的初始化例如:例如: struct student int id; char
13、 name20; char sex; int age; stud3=1,”张三张三”,m,21,2,”李四李四”,m,20,3,”王五王五”,f,22; /定义含有三个元素的结构数组,并且逐一进行初始化。定义含有三个元素的结构数组,并且逐一进行初始化。注意:在为全部元素进行初始化时,可以省略数组长度。注意:在为全部元素进行初始化时,可以省略数组长度。结构数组的应用【例【例10-3】编写程序,使用结构数组存储学生信息,输入三门课程的成绩,输出】编写程序,使用结构数组存储学生信息,输入三门课程的成绩,输出每门课程的平均分,并按个人总分输出最高分和最低分。每门课程的平均分,并按个人总分输出最高分和最
14、低分。 #include struct studentint id;char name20;char sex;int age;float score3;float sum;void main()struct student stu3=1,张三张三,m,21,2,李四李四,m,20,3,王五王五,f,22;int i,j;float m,n;float aver3=0,0,0;printf(请输入学生三门课程的成绩请输入学生三门课程的成绩:n);printf(课程课程1 课程课程2 课程课程3n);for(i=0;i3;i+)for(j=0;j3;j+)scanf(%f,&stui.sc
15、orej);for(stui.sum=0,j=0;j3;j+)stui.sum+=stui.scorej;for(j=0;j3;j+)averj=averj+stui.scorej; int min,max,mink,maxk;min=max=stu0.sum;for(int k=0;kmax)max=stuk.sum;maxk=k;if(stuk.summin)min=stuk.sum; mink=k;printf(学号学号 姓名姓名 性别性别 年龄年龄 课程课程1 课程课程2 课程课程3 总分总分n);for(i=0;i3;i+) printf(%3d %6s %3c %5d ,stui.
16、id,, stui.sex,stui.age);for(j=0;j3;j+) printf(%8.1f,stui.scorej);printf(%8.1f,stui.sum);printf(n);printf(总分最高者是:总分最高者是:%d号号 %5s %8.1fn,stumaxk.id, ,stumaxk.sum); printf(总分最低者是:总分最低者是:%d号号 %5s %8.1fn,stumink.id, ,stumink.sum);printf(每门课程成绩平均分每门课程成绩平均分:n);printf(成绩成绩1
17、成绩成绩2 成绩成绩3:n);for(j=0;j成员名成员名例如:例如: (*p)id (*p)name或者或者 p-id p-name指向结构变量的指针【例【例10-4】使用结构指针变量访问结构】使用结构指针变量访问结构#includestruct student int id; char name20; char sex; int age; float score3;void main() struct student stu=1,王五王五,m,21,*p; p=&stu; printf(请输入该同学的成绩:请输入该同学的成绩:);指向结构变量的指针 for(int i=0;iid
18、,p-name,p-sex,p-age); for(int j=0;jscorej); printf(n);指向结构变量的指针程序的运行结果如图程序的运行结果如图10-5所示:所示: 图图10-5 例例10-4运行结果运行结果指向结构数组的指针 可以使用指针变量指向一个结构数组,这时,指针变量的值就是该结可以使用指针变量指向一个结构数组,这时,指针变量的值就是该结构数组的首地址,即数组的构数组的首地址,即数组的0号元素地址,可通过指针的移动,指向结构数号元素地址,可通过指针的移动,指向结构数组中的其它元素。组中的其它元素。 例如,结构指针例如,结构指针p指向一个结构数组,则指向一个结构数组,则
19、p的值就是该数组的的值就是该数组的0号元素的号元素的地址,地址,p+1就是就是1号元素的地址,号元素的地址,p+i就是就是i号元素的地址,这与指向普通数号元素的地址,这与指向普通数组的指针是一样的。组的指针是一样的。 结构指针变量还可以指向数组元素,这时,该指针变量的值就是所指结构指针变量还可以指向数组元素,这时,该指针变量的值就是所指向的数组元素的首地址。向的数组元素的首地址。指向结构数组的指针【例【例10-5】使用指向结构数组的指针变量访问数组元素。】使用指向结构数组的指针变量访问数组元素。#include struct student int id; char name20; char
20、sex; int age; float score3; float sum;void main() struct student stu3=1,张三张三,m,21,2,李四李四, m,20,3,王五王五,f,22,*p; int j; printf(请输入学生的成绩请输入学生的成绩:n学号学号 成绩成绩1 成绩成绩2 成绩成绩3n);for(p=stu;pid);for(j=0;jscorej);for(p-sum=0,j=0;jsum+=p-scorej;printf(输出成绩单如下输出成绩单如下:n);printf(学号学号 姓名姓名 性别性别 年龄年龄 成绩成绩1 成绩成绩2 成绩成绩3
21、 总分总分n);for(p=stu;pid,p-name,p-sex,p-age);for(j=0;jscorej);printf(%9.1f,p-sum);printf(n);指向结构数组的指针程序的运行结果如图程序的运行结果如图10-6所示:所示: 图图10-6 例例10-5运行结果运行结果指向结构变量的指针作函数参数 在在C语言中,可以使用结构变量作函数参数进行整体传送,但是这种语言中,可以使用结构变量作函数参数进行整体传送,但是这种传送要将全部成员逐个传送,时间和空间开销很大,严重地降低了程序的传送要将全部成员逐个传送,时间和空间开销很大,严重地降低了程序的执行效率。执行效率。 使用指
22、针变量作函数参数进行传送可以解决这个问题。这时由实参传使用指针变量作函数参数进行传送可以解决这个问题。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。向形参的只是地址,从而减少了时间和空间的开销。指向结构变量的指针作函数参数【例【例10-6】使用指向结构变量的指针作为函数参数。】使用指向结构变量的指针作为函数参数。#include struct student /定义结构定义结构int id;char *name;char sex;int age;int score;void func(struct student *ps)int i;printf(该学生的信息如下该学生的信息如下:
23、n); /输出结构变量各成员的信息输出结构变量各成员的信息printf(学号学号:%d 姓名姓名:%s 性别性别:%c 年龄年龄:%d 成绩:成绩:%d,ps-id,ps-name,ps-sex,ps-age,ps-score);指向结构变量的指针作函数参数printf(n);void main() /初始化结构变量,定义一个结构指针变量初始化结构变量,定义一个结构指针变量struct student stu=3,张三张三,m,23,90,*p;p=&stu; func(p); /指向结构变量指向结构变量程序的运行结果如图程序的运行结果如图10-7所示:所示: 图图10-7 例例10-
24、6运行结果运行结果指向结构数组的指针作函数参数 【例【例10-7】编写程序,使用结构指针作为函数参数,计算并输出一组学生】编写程序,使用结构指针作为函数参数,计算并输出一组学生成绩的总分、平均分和不及格人数。成绩的总分、平均分和不及格人数。#include struct student int num; char *name; char sex; int score;stu5=11,李颖李颖,M,55, 12,何平何平,M,75, 13,张芳张芳,F,92, 14,陈龙陈龙,F,85, 15,王莹王莹,M,48;void main() struct student *ps;指向结构数组的指针作
25、函数参数void ave(struct student *ps); ps=stu; ave(ps);void ave(struct student *ps) int c=0,i,ave,s=0; for(i=0;iscore; if(ps-score60) c+=1; printf(总分:总分:%d ,s); ave=s/5; printf(平均分:平均分:%d 不及格人数:不及格人数:%dn,ave,c);指向结构数组的指针作函数参数程序的运行结果如图程序的运行结果如图10-8所示:所示: 图图10-8 例例10-7运行结果运行结果10.4 动态内存分配 C语言提供了内存管理函数,可以按需要
26、动态地分配内存空间,也可语言提供了内存管理函数,可以按需要动态地分配内存空间,也可以把不再使用的空间释放待用,从而更加有效的利用了内存空间。常用的以把不再使用的空间释放待用,从而更加有效的利用了内存空间。常用的内存管理函数有如下三个:内存管理函数有如下三个:1.分配内存空间函数分配内存空间函数malloc() 调用调用malloc()函数的一般形式为:函数的一般形式为: (类型说明符(类型说明符 *)malloc(size)例如:例如: char *p; p=(char *)malloc(12);10.4 动态内存分配 2.分配内存空间函数分配内存空间函数calloc() calloc()函数
27、也用于动态的分配内存空间。调用该函数的一般形式为:函数也用于动态的分配内存空间。调用该函数的一般形式为: (类型说明符(类型说明符 *)calloc(n,size) 例如:例如: struct student *p; p=(struct student *)calloc(5,sizeof(struct student);10.4 动态内存分配【例例10-8】使用使用calloc()函数动态分配内存空间。函数动态分配内存空间。#include#includevoid main()struct studentint id;char name20;struct student *p; p=(stru
28、ct student *)calloc(5,sizeof(struct student);printf(该连续区域的地址分别是:该连续区域的地址分别是:n);for(int i=0;i5;i+)printf(%pn,p+i);10.4 动态内存分配程序的运行结果如图程序的运行结果如图10-9所示:所示:图10-9 例10-8运行结果 3.释放内存空间函数释放内存空间函数free() free()函数释放由函数释放由malloc()函数和函数和calloc()函数分配的内存空间。函数分配的内存空间。调用该函数的一般形式为:调用该函数的一般形式为: free(void *p);10.4 动态内存分
29、配【例例10-9】动态分配一块区域存储结构变量实现对结构变量成员的访问。动态分配一块区域存储结构变量实现对结构变量成员的访问。#include#includevoid main() struct student int id; char *name; char sex; float score3; *ps; ps=(struct student*)malloc(sizeof(struct student); ps-id=20; ps-name=Zhang Jing; ps-sex=M;printf(请输入三门课程的成绩:请输入三门课程的成绩:);10.4 动态内存分配 for(int i=0;
30、iscorei); printf(学号:学号:%d 姓名:姓名:%s 性别:性别:%cn成绩:成绩:,ps-id,ps-name,ps-sex); for(int j=0;jscorej);printf(n); free(ps);程序的运行结果如图程序的运行结果如图10-1010-10所示:所示:图图10-10 例例10-9运行结果运行结果 10.5 结构与链表 在上一节中介绍了使用在上一节中介绍了使用malloc()函数可以为变量动态分配一块内存空函数可以为变量动态分配一块内存空间,这块空间可以存放一个变量的数据,在计算机专业词汇中,将这样的间,这块空间可以存放一个变量的数据,在计算机专业词
31、汇中,将这样的一块单元称为一个一块单元称为一个“结点结点”。要存放多少个变量的数据,就需要建立多少。要存放多少个变量的数据,就需要建立多少个个结点。结点。 链表是一种常见的、重要的数据结构,它是通过动态分配存储空间而建链表是一种常见的、重要的数据结构,它是通过动态分配存储空间而建立的一种结构,是利用指针将多个结点链在一起的线性结构。在链表中,立的一种结构,是利用指针将多个结点链在一起的线性结构。在链表中,添加、删除一个结点非常方便,只需要在每个结点中存放下一个结点的地添加、删除一个结点非常方便,只需要在每个结点中存放下一个结点的地址(指针),用以把所有结点址(指针),用以把所有结点“链链”成一
32、串。成一串。 10.5 结构与链表 可以从第一个结点开始,依次找到下一个结点的地址,直到最后一个可以从第一个结点开始,依次找到下一个结点的地址,直到最后一个结点,而不能够反向查找的链表,称为单向链表。单向链表的示意图如图结点,而不能够反向查找的链表,称为单向链表。单向链表的示意图如图10-11所示:所示: 图图10-11(b)单向链表结构示意图)单向链表结构示意图 图图10-11(a)单向链表结点的结构)单向链表结点的结构10.5 结构与链表例如,一个存放学生信息的结点具有如下形式:例如,一个存放学生信息的结点具有如下形式:struct student int id; char name20;
33、 char sex; struct student *next;其中前面其中前面3个成员组成数据域,最后一个成员个成员组成数据域,最后一个成员next构成指针域,它是指向构成指针域,它是指向student结构类型变量的指针。结构类型变量的指针。链表操作 链表的基本操作包括建立链表、对链表的访问和遍历以及向链表中插链表的基本操作包括建立链表、对链表的访问和遍历以及向链表中插入或删除一个结点。入或删除一个结点。 由于链表的结点所占的内存是动态的,在程序运行过程中,需要添加由于链表的结点所占的内存是动态的,在程序运行过程中,需要添加一个结点的时候就动态申请一个结点的内存空间,不需要使用这个结点时一个
34、结点的时候就动态申请一个结点的内存空间,不需要使用这个结点时就释放它所占用的内存空间。就释放它所占用的内存空间。例如:例如: struct student *p=malloc(sizeof(struct student); p-id=20; p-name=”Wang wu”; ps-sex=M; p-score=90; free(p);就是申请一个结点,为结点的成员赋值和释放该结点的过程。就是申请一个结点,为结点的成员赋值和释放该结点的过程。链表操作【例【例10-10】建立链表,存放一个小组中三名学生的信息,包括学号、姓】建立链表,存放一个小组中三名学生的信息,包括学号、姓名、性别和一门课程的
35、成绩。名、性别和一门课程的成绩。#include#includestruct studentint id;char name20;char sex;float score;struct student *next;*p;struct student *createlinkedlist(int n)struct student *head,*p,*q;printf(请输入学号、姓名、性别、成绩:请输入学号、姓名、性别、成绩:n);for(int i=0;iid,p-name);getchar();p-sex=getchar();scanf(%f,&p-score)if(i=0) /i=0
36、时,该结点地址作为头指针时,该结点地址作为头指针head=p; q=p; elseq-next=p; /i!=0时,将该结点的地址赋给上一个结点指针域时,将该结点的地址赋给上一个结点指针域 q=p;q-next=NULL; /设置最后一个结点的指针域为设置最后一个结点的指针域为NULLreturn head;void main()int n;printf(请输入学生人数请输入学生人数n:);scanf(%d,&n);p=createlinkedlist(n);链表操作printf(您输入的信息是:您输入的信息是:n);for(int i=0;iid,p-name,p-sex,p-sco
37、re);p=p-next;程序的运行结果如图10-13所示:图图10-12 例例10-10运行结果运行结果 链表操作【例【例10-11】编写函数,在链表中查找成绩为】编写函数,在链表中查找成绩为90分的同学,并输出该同学的信息。分的同学,并输出该同学的信息。void find(struct student *head) struct student *p; for(p=head;p!=NULL;p=p-next) if(p-score=90) printf(您查找的学生是:您查找的学生是:); printf(%d %s %c %fn,p-id,p-name,p-sex,p-score); /省
38、略例省略例10-10中定义结构中定义结构student和定义函数和定义函数createlinkedlist(n)等代码等代码 void main() struct student *px; px=p=createlinkedlist(n); find(px);链表操作程序的运行结果如图程序的运行结果如图10-13所示:所示:图图10-13 例例10-11运行结果运行结果 链表操作【例【例10-12】编写函数,删除链表中指定的结点。】编写函数,删除链表中指定的结点。 /省略例省略例10-10中定义结构中定义结构student和定义函数和定义函数createlinkedlist(n)等代码等代码v
39、oid deletejd(struct student *head,int xid)struct student *p,*q;q=head;if(q-id=xid) /判断要被删除结点是否是头指针指向的结点判断要被删除结点是否是头指针指向的结点head=q-next;elsefor(p=q,q=q-next;q!=NULL;p=p-next,q=q-next)if(q-id=xid) break;if(q!=NULL) /如果如果q!=NULL说明已经找到要删除的结点说明已经找到要删除的结点p-next=q-next; /删除删除q结点结点free(q); /释放释放q结点所占的内存结点所占的
40、内存else /如果如果q=NULL说明没有找到要删除的结点说明没有找到要删除的结点printf(没有找到要删除的结点!没有找到要删除的结点!n);void main()int n;struct student *px,*qs;printf(请输入学生人数请输入学生人数n:);scanf(%d,&n);qs=px=p=createlinkedlist(n);printf(您输入的信息是:您输入的信息是:n);for(int i=0;iid,p-name,p-sex,p-score); p=p-next;int x;printf(请输入要删除的学号:请输入要删除的学号:);scanf(%
41、d,&x); deletejd(px,x);for(int j=0;jid,qs-name,qs-sex,qs-score); qs=qs-next;链表操作程序的运行结果如图10-14所示:图图10-14 例例10-12运行结果运行结果 链表操作【例【例10-13】编写函数,在按学号由小到大排列的链表中插入一个结点。】编写函数,在按学号由小到大排列的链表中插入一个结点。 【解题思路】【解题思路】 在链表中插入一个结点,要求链表本身必须是按某种规律排好序的。本例中,在链表中插入一个结点,要求链表本身必须是按某种规律排好序的。本例中,链表中的结点是按照学号由小到大排序的,则插入可分以下四
42、种情况考虑:链表中的结点是按照学号由小到大排序的,则插入可分以下四种情况考虑:(1)原表为空表。只需要将)原表为空表。只需要将head指向被插入的结点即可,被插入的结点的指针指向被插入的结点即可,被插入的结点的指针域置为域置为NULL。(2)被插入的结点数据最小,应插入到头指针之后。这种情况下,使)被插入的结点数据最小,应插入到头指针之后。这种情况下,使head指向指向被插入结点,被插入结点的指针域指向原来头指针之后的那个结点。被插入结点,被插入结点的指针域指向原来头指针之后的那个结点。(3)被插入的结点数据最大,应插入到表尾。这种情况下,使原来最后一个结)被插入的结点数据最大,应插入到表尾。
43、这种情况下,使原来最后一个结点的指针域指向被插入结点,被插入结点的指针域置为点的指针域指向被插入结点,被插入结点的指针域置为NULL。(4)在中间某位置插入。这种情况下,使插入位置的前一个结点的指针域指向)在中间某位置插入。这种情况下,使插入位置的前一个结点的指针域指向被插入结点,使被插入结点的指针域指向插入位置的后一个结点。被插入结点,使被插入结点的指针域指向插入位置的后一个结点。 /省略例省略例10-10中定义结构中定义结构student和定义函数和定义函数createlinkedlist(n)等代码等代码void insertjd(struct student *head,int xid
44、) struct student *p,*q,*pf; p=head; q=(struct student*)malloc(sizeof(struct student); /根据给定的学号创建新结点根据给定的学号创建新结点 q-id=xid; printf(“请输入姓名、性别、成绩:请输入姓名、性别、成绩:n”); scanf(%s,q-name);getchar();q-sex=getchar();scanf(%f,&q-score); if(head=NULL) /如果是空表,将插入结点的地址赋给头指针如果是空表,将插入结点的地址赋给头指针 head=q; q-next=NULL;
45、 else while(q-idp-id) & (p-next!=NULL) /p从从head开始,依次向后移动,寻找第一个开始,依次向后移动,寻找第一个idxid的结点的结点 pf=p; /pf一直指向一直指向p的前一个结点的前一个结点 p=p-next; if(q-idid) if(head=p) /在头指针之后位置插入在头指针之后位置插入 head=q; q-next=p; else /在中间某位置插入在中间某位置插入 pf-next=q; q-next=p; else /在表尾插入在表尾插入 p-next=q; q-next=NULL; void main() int n; s
46、truct student *px,*qs; printf(请输入学生人数请输入学生人数n:); scanf(%d,&n); qs=px=p=createlinkedlist(n); printf(您输入的信息是:您输入的信息是:n); for(int i=0;iid,p-name,p-sex,p-score);p=p-next;链表操作 int x;printf(请输入要插入的学号:请输入要插入的学号:);scanf(%d,&x); insertjd(px,x); for(int j=0;jid,qs-name,qs-sex,qs-score); qs=qs-next;链表操
47、作程序的运行结果如图10-15所示: 图图10-15 例例10-13运行结果运行结果 10.6 共用1. 共用的概念共用的概念 与结构相似,共用是一种由不同数据类型构造出的类型,在共用内,与结构相似,共用是一种由不同数据类型构造出的类型,在共用内,可以定义多种不同数据类型的成员,不同的是,共用类型的变量的所有成可以定义多种不同数据类型的成员,不同的是,共用类型的变量的所有成员共用一块内存空间。虽然共用变量的每个成员都可以赋值,但前面赋予员共用一块内存空间。虽然共用变量的每个成员都可以赋值,但前面赋予的成员值被后面赋予的成员值所覆盖,只有最后一次赋予的成员值能够保的成员值被后面赋予的成员值所覆盖
48、,只有最后一次赋予的成员值能够保存且有意义。存且有意义。 共用类型定义的一般形式为:共用类型定义的一般形式为: union 共用类型名共用类型名 成员序列;成员序列; 变量序列;变量序列;共用例如:例如: union data1 int i; double d; char c; m; 定义包括定义包括3个成员的共用,分别是个成员的共用,分别是int型的型的i、double型的型的d和和char型的型的c。定义。定义m为该共用类型的变量。为该共用类型的变量。 既然共用变量的所有成员共同占用一块内存空间,这块空间的大小应该能够存放所有成员中占用空间长度最大者。 共用 下面定义含有相同成员的共用和结
49、构,比较它们之间的区别:下面定义含有相同成员的共用和结构,比较它们之间的区别: struct data2 int i; double d; char c;n; union data1 int i; double d; char c; m;图图10-16 共用和结构的区别共用和结构的区别 共用【例【例10-14】输出共用变量和结构变量空间占用的大小。】输出共用变量和结构变量空间占用的大小。#includeunion data1 int i; double d; char c;m;struct data2 int i; double d; char c;n;void main() printf(各
50、种类型变量所占字节数:各种类型变量所占字节数:n); printf(共用变量:共用变量:%d ,sizeof(m);共用 printf(结构变量:结构变量:%dn,sizeof(n); printf(成员类型所占字节数:成员类型所占字节数: n); printf(int:%d ,sizeof(int); printf(double:%d ,sizeof(double); printf(char:%dn,sizeof(char);图图10-17 例例10-14运行结果运行结果 程序的运行结果如图10-17所示: 共用变量的引用 2.共用变量的引用共用变量的引用 对共用变量的赋值和使用都是对变量的成员进行的,其一般形式为:对共用变量的赋值和使用都是对变量的成员进行的,其一般形式为: 共用变量名共用变量名.成员名成员名使用共用类型数据时应注意以下几点:使用共用类型数据时应注意以下几点:(1)同一段空间内可以存放不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025商业房产租赁合同附加协议示范文本
- 肺结节切除术护理查房
- 《契丹崛起与北宋建立》宋元时期课件-1
- 车床加工行业介绍
- 劳务派遣合作协议揭阳市
- 2025劳动合同协议格式模板范文
- 肾病护士健康教育比赛
- 技术专家顾问聘用协议书二零二五年
- 二零二五工程劳务分包合同的范例
- 基坑气膜隔声隔声机理
- 护理质量与安全分析汇报
- 生物质能源综合利用项目可行性分析报告
- 《印度文化与历史:大学人文课程教案》
- 老年防诈骗知识讲座课件
- 湖北省部分高中联考协作体2023-2024学年高二下学期期中考试物理试卷(含答案)
- 中学2021年秋季开学疫情防控工作方案及要求4篇
- DB33-T 1411-2024 水利工程文化融合导则
- 档案管理制度培训宣贯
- 农机质量跟踪调查表
- 刑民交叉案件的司法认定
- DB11-T 1448-2017 城市轨道交通工程资料管理规程
评论
0/150
提交评论