资源描述:
《结构体与共用体.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、结构体指针与指针链表所谓结构体指针就是指向结构体数据类型的指针,一个结构体变量的起始地址就是这个结构体变量的指针。同样,如果把结构体起始地址放入一个地址变量中,那么该指针(地址变量)就是指向该结构体的变量。需要注意的是结构体指针定义类型必须与要指向的结构体变量的类型相同。例:用结构体指针对年龄在19岁以下(含19岁)同学的成绩增加10分。#includestructstudent{intnum;charname[20];charsex;intage;floatscore;};结构体指针与指针链表structstudentstu[4]={{11301,"
2、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(;psage<=19)ps->score+=10;printf("%s,%d,%5.1f",ps->name,ps->age,ps->score);}}用指针处理链表链表是一种常见的重要的数据结构,它是动态地进行存储分配的
3、一种结构。用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同的班级的学生数据,则必须定义长度最大为100的数组。显然这将会浪费内存。链表没有这种缺点,它根据需要开辟内存单元。下图表示最简单的一种链表(单向链表)的结构:地址值地址值地址值空头指针用指针处理链表链表有一个“头指针”变量,它存放一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点包括两个部分:一为用户需要用的实际数据值,二为下一个结点的地址。即头指针指向第一个元素;第一个元素又指向第二个元素……直到最后一个元素,
4、该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”(表示空地址),链表至此结束。这种链表的数据结构,必须利用指针变量才能实现。用结构体变量作为链表中的结点最合适。用指针处理链表#include#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.scor
5、e=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf("%ld%5.1f",p->num,p->score);p=p->next;}while(p!=NULL);}例:建立一个简单链表,它由3个学生数据的结点组成。输出各结点中的数据。用指针处理链表上例比较简单,所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。链表结构是动态地分配存储的,即在需要时才开辟一个结点的存储单元。这种链表称为“动态链表”。C语言编译系统的库函数提供了动态开辟和释放存储单元的有关函数。
6、使用这些函数要进行预处理#include用指针处理链表1.malloc函数函数原型:void*malloc(unsignedintsize);作用:在内存的动态存储区中分配一个长度为size的连续空间。返回值是一个指向分配域起始地址的指针;如果未能成功执行,则返回空指针(NULL)。2.calloc函数函数原型:void*calloc(unsignedn,unsignedsize);作用:在内存的动态存储区中分配n个长度为size的连续空间。返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。3.free函数函数原型:voidfree(v
7、oid*p);作用:释放由p指向的内存区,使这部分存储区能被其他变量使用。无返回值。用指针处理链表#include#include#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudent*head,*p1,*p2;inti,n;scanf("%d",&n);head=(structstudent*)malloc(sizeof(structstudent));scanf("%ld%f",&