08-结构体与共用体-2

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

结构体指针与指针链表所谓结构体指针就是指向结构体数据类型的指针,一个结构体变量的起始地址就是这个结构体变量的指针。同样,如果把结构体起始地址放入一个地址变量中,那么该指针(地址变量)就是指向该结构体的变量。需要注意的是结构体指针定义类型必须与要指向的结构体变量的类型相同。例:用结构体指针对年龄在19岁以下(含19岁)同学的成绩增加10分。#includestdio.hstructstudent{intnum;charname[20];charsex;intage;floatscore;};结构体指针与指针链表structstudentstu[4]={{11301,ZhangPing,'F',19,496.5},{11302,WangLi,'F',20,483},{11303,LiuHong,'M',19,503},{11304,SongRui,'M',19,471.5}};main(){structstudent*ps;ps=&(stu[0]);for(;psstu+4;ps++){if(ps-age=19)ps-score+=10;printf(%s,%d,%5.1f\n,ps-name,ps-age,ps-score);}}用指针处理链表•链表是一种常见的重要的数据结构,它是动态地进行存储分配的一种结构。•用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同的班级的学生数据,则必须定义长度最大为100的数组。显然这将会浪费内存。•链表没有这种缺点,它根据需要开辟内存单元。下图表示最简单的一种链表(单向链表)的结构:地址值地址值地址值空头指针用指针处理链表•链表有一个“头指针”变量,它存放一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点包括两个部分:一为用户需要用的实际数据值,二为下一个结点的地址。即头指针指向第一个元素;第一个元素又指向第二个元素……直到最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”(表示空地址),链表至此结束。•这种链表的数据结构,必须利用指针变量才能实现。用结构体变量作为链表中的结点最合适。用指针处理链表#includestdio.h#defineNULL0//常量定义structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf(%ld%5.1f\n,p-num,p-score);p=p-next;}while(p!=NULL);}例:建立一个简单链表,它由3个学生数据的结点组成。输出各结点中的数据。用指针处理链表•上例比较简单,所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。•链表结构是动态地分配存储的,即在需要时才开辟一个结点的存储单元。这种链表称为“动态链表”。•C语言编译系统的库函数提供了动态开辟和释放存储单元的有关函数。使用这些函数要进行预处理#includemalloc.h用指针处理链表1.malloc函数函数原型:void*malloc(unsignedintsize);作用:在内存的动态存储区中分配一个长度为size的连续空间。返回值是一个指向分配域起始地址的指针;如果未能成功执行,则返回空指针(NULL)。2.calloc函数函数原型:void*calloc(unsignedn,unsignedsize);作用:在内存的动态存储区中分配n个长度为size的连续空间。返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。3.free函数函数原型:voidfree(void*p);作用:释放由p指向的内存区,使这部分存储区能被其他变量使用。无返回值。用指针处理链表#includestdio.h#includemalloc.h#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudent*head,*p1,*p2;inti,n;scanf(%d,&n);head=(structstudent*)malloc(sizeof(structstudent));scanf(%ld%f,&head-num,&head-score);p2=head;for(i=1;in;i++){p1=(structstudent*)malloc(sizeof(structstudent));scanf(%ld%f,&p1-num,&p1-score);p2-next=p1;p2=p1;}p2-next=NULL;例:建立动态链表。用指针处理链表p1=head;//输出各个结点的值while(p1!=NULL){printf(%ld%5.1f\n,p1-num,p1-score);p1=p1-next;}}动态删除、插入链表例:删除动态链表head中p1指定的结点:main(){structstudent*p1,*p2;……p2=head;while(p2-next-score!=22.6&&p2!=NULL)p2=p2-next;if(p2!=NULL){p1=p2-next;p2-next=p1-next;free(p1);}}134.6211.7422.6head1133.6nextnextnextNULLP2P1动态删除、插入链表例:在动态链表的p2位置插入p1节点:先将p2之后的节点连接到p1上:p1-next=p2-next;134.6211.7422.6head1133.6nextnextnextNULLP2P1134.6211.7422.6head1133.6nextnextnextNULLP2P1再将p1连接到p2上:p2-next=p1;共用体与枚举类型联合体类型定义•所谓联合体数据类型是指将不同的数据项存放于同一段内存单元的一种构造数据类型。同结构体类型相似,在一个联合体内可以定义多种不同的数据类型;不同的是,在一个联合体类型的变量中,其所有成员共用同一块内存单元,因此,虽然每一个成员均可以被赋值,但只有最后一次赋进去的成员值能够保存下来,而先前赋进去的那些成员值均被后来的覆盖了。•定义一个联合体类型的一般形式为:union联合体名{成员1类型1;成员2类型2;……成员n类型n;}共用体与枚举类型枚举类型•所谓枚举类型是指这种变量的值只能限于事前已经一一列举出来的值的范围。比如描述星期几的数据就只能在星期日、星期一到星期六之间选择。•用关键字enum定义枚举类型,如:enumweekday{sun,mon,tue,wed,thu,fri,sat};weekday是枚举类型名,可以用于定义变量,如:enumweekdayweek1,week2;定义了两上枚举变量,它们只能取sun到sat这七个值之一,如:week1=wed;week2=fri;上述枚举类型的定义中,sun、mon、……、sat称为“枚举元素”或“枚举常量”。上机实践与课后作业上机实践:P201-学生成绩管理系统课后作业:P207:一、二C语言程序设计项目教程主编:康玉忠、甘宏、段传林副主编:扶卿妮、樊红珍、李彬Thankyou

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功