资源描述:
《C语言第十八讲.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言电子教案(十八)第十八讲第十一章结构体和共用体主要内容:§11.7用结构体指针处理链表链表概述动态存储函数链表的建立链表的输出一、链表概述如果我们使用数组来存放一组数据,必须定义数组的大小。在无法确定数组大小的情况下,就必须将数组定义得足够大,以能适应不同的需要,这将造成系统资源(内存资源)浪费。使用一种新的数据结构--链表,就能克服上述缺点,它将根据需要开辟内存单元,因为链表结构是动态地分配存储,即在需要时才开辟一个结点的存储单元,因而就可以解决内存资源和用户需求之间的矛盾。链表:链表是一种新
2、的数据结构,系统对链表的元素是动态地进行存储分配。结点:链表中的每一个元素称为结点(又称为域)。链表的基本构成:表头、一个或多个结点(域)、表尾。表头:链表有一个头指针变量,其中存放一个地址,该地址指向链表中的第一个元素(即第一个结点)结点:链表中的每一个元素叫作一个结点(又叫域),结点都是结构体类型,每个结点包括若干个实际数据和一个指向本结构体的指针变量(称为指针域),指针域用来指明下一个结点的地址。表尾:链表最后一个结点中的指针域中存放一个空地址(用“NULL”来表示),以表示链表的结束。一、链表
3、概述一、链表概述(四个结点的链表构成)2480头指针3420结点12600结点2NULL2800结点32000第四结点(链尾)2480342026002800头指针的指针域存放第一结点地址第一结点的指针域存放第二结点地址第二结点的指针域存放第三结点地址第三结点的指针域存放第四结点地址链尾的指针域存放空地址指针域结点起始地址二、有关链表的函数1.malloc()函数(开辟一个动态存储区函数)调用格式:malloc(size)功能:在内存的动态存储区中分配一个长度为size的连续空间返回值:空类型指针,其
4、值为该连续存储单元的起始地址,若出错返回0说明:size是一个整型表达式二、有关链表的函数2.malloc()函数(开辟多个动态存储区函数)调用格式:calloc(n,size)功能:在内存的动态存储区中分配n个长度为size的连续空间返回值:空类型指针,其值为该连续存储单元的起始地址,若出错返回0说明:size是一个整型表达式二、有关链表的函数3.free()函数(释放动态存储区函数)调用格式:free(ptr)功能:在内存释放ptr所指向的内存区返回值:无说明:ptr是最近一次调用calloc()
5、或malloc()函数时返回的函数值三、简单的建立单向链表的方法定义结构体指针变量p1,p2,headp1指向新开辟的存储单元p2指向链表中最后一个结点head指向头结点定义整型变量n计结点个数n=n+1YN结点连接(p1→p2->next)p2下移(p1→p2)开辟一个新结点并使p1指向它为新单元的数据域输入学号和成绩p1->num!=0n=1;开辟一个新结点并使p1,p2,head指向该结点为新结点数据域输入学号和成绩三、简单的建立单向建立链表的程序#defineNULL0#defineL
6、ENsizeof(structstudent)structstudent{longnum;intscore;structstudent*next;};intn=0;structstudent*creat(){structstudent*p1,*p2,*head;p1=(structstudent*)malloc(LEN);head=p2=p1;printf("请输入一个学生的学号和成绩:");scanf("%ld%d",p1->num,p1->score);while(p1->num!=0){n=
7、n+1;p2->next=p1;p2=p1;p1=(structstudent*)malloc(LEN);printf("请输入一个学生的学号和成绩:");scanf("%ld%d",p1->num,p1->score);}p2->next=NULL;return(head);}/*creat函数能返回一个指向链表头的指针*//*新开辟一个单元并使p1,p2,head指向该单元*/运行程序/*计数器加1,连接,p2下移*//*新开辟一个单元并使p1指向该单元*/四、完整的建立单向链表的方法定义结构
8、体指针变量p1,p2,headp1指向新开辟的存储单元,p2指向链表中最后一个结点head指向头结点,定义整型变量n计结点个数n=n+1YNp2下移(p1→p2)开辟一个新结点并使p1指向它为新单元的数据域输入学号和成绩p1->num!=0开辟一个新结点并使p1,p2指向它NULL→head,0→n为新结点数据域输入学号和成绩n==1p1→head作为首结点结点连接(p1→p2->next)YN四、完整的建立单向建立链表的程序#defineNULL0