C语言-链表.ppt
- 文档编号:2643742
- 上传时间:2022-11-04
- 格式:PPT
- 页数:28
- 大小:820.50KB
C语言-链表.ppt
《C语言-链表.ppt》由会员分享,可在线阅读,更多相关《C语言-链表.ppt(28页珍藏版)》请在冰豆网上搜索。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun111.7用指针处理链表用指针处理链表1.链表概述链表概述1)动态数据结构概念数组和结构体是定长数据结构,而链表、堆栈、队列、树、图等是执行时大小可变的动态数据结构。
链表是连成一行连成一行的数据项集合,每一个数据项(元素)称为节点,可以在链表中的任意位置进行节点插入或删除操作,使链表数据项的个数随之增加或减少。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun22)链表的构成单向链表图示:
单向链表图示:
104813701012头节点表内节点尾节点210189.513702304901012291885NULL1048head其中:
其中:
各节点是相同的结构体类型,该类型有三个成员;head是指针变量,存放链表的头节点指针1048;各节点应包含一个指针成员存放下一节点的地址;各节点存储有可能不连续,但各节点逻辑上连续。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun33)节点的构成上图每个节点具有如下结构体类型:
structstudentlongnum;floatscore;structerstudent*next;/*链节成员*/其中:
其中:
成员num、score用于存放一个节点的具体数据;成员next是指针类型,用于存放下一节点指针,最后一个节点的next成员存放空指针NULL;成员next是指向与自身同一类型的结构,这种结构称为自引用结构。
(只有指针成员可自引用)节点是在运行时动态生成的。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun44)动态内存分配和释放建立和维护动态数据结构需要实现动态内存分配;如在链表中插入节点需要先申请一段存储区域,而删除一个节点需要释放该节点原先占用的存储区域,这可由标准函数实现。
内存分配函数原形:
内存分配函数原形:
void*malloc(unsignedsize);功能:
功能:
申请长度为size个字节的内存空间;若申请成功,返回存储块起始指针,该指针类型为void*;否则返回空指针(NULL)。
内存释放函数原形:
内存释放函数原形:
voidfree(void*p);功能:
功能:
释放p所指向的内存块。
包含文件:
包含文件:
malloc.h、stdlib.h中均有其原型声明。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun55)采用链表的意义与定长数据结构数组相比,链表能更好地利用内存,按需分配和释放存储空间。
在链表中插入或删除一个节点,只需改变某节点“链节”成员的指向,而不需要移动其它节点,相对数组元素的插入和删除效率高。
即:
链表特别适合于对大线性表频繁插入和删除元素、或成员数目不定的数据结构。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun66)链表的类型单链表:
单链表:
每个节点只有一个指向后继节点的指针双向链表:
双向链表:
每个节点有两个用于指向其它节点的指针;一个指向前趋节点,一个指向后继节点循环链表:
循环链表:
使最后一个节点的指针指向第一个节点C程序设计第十一章结构体与共用体NWPUCCZhangYanChun72.单链表的建立和输出单链表的建立和输出建立链表的准备工作建立链表的准备工作:
1)定义链表的节点类型;2)定义与节点同类型的链表头指针变量head并赋值0,表示链表在建立之前是空的;3)定义与节点同类型的工作指针变量p1、p2。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun8建立链表的步骤:
建立链表的步骤:
1)开辟第一个节点的存储区域,使head、p1、p2指向第一个节点,并输入第一个节点数据;210189.5headp1p2操作:
操作:
len=sizeof(structstudent);p1=(structstudent*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);head=p2=p1;C程序设计第十一章结构体与共用体NWPUCCZhangYanChun92)开辟下一节点的存储区域,使p1指向新节点、输入新节点数据,并将上一个节点的next成员指向新节点;210189.5headp1p22304901048操作:
操作:
p1=(structstudent*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);p2-next=p1;p2=p1;/*使p2也指向新节点*/13701370p2p1C程序设计第十一章结构体与共用体NWPUCCZhangYanChun103)重复第2步,建立并链接多个节点直至所需长度,将末尾节点的next成员赋值0。
210189.51370headp2230490291885p2NULL10481370p110121012p2p1操作:
操作:
p1=(structstudent*)malloc(len);scanf(%ld,%f,&p1-num,&p1-score);p2-next=p1;p2=p1;/*使p2也指向新节点*/p2-next=NULL;/*末尾节点next赋值0*/C程序设计第十一章结构体与共用体NWPUCCZhangYanChun11【例】建立并输出有3名学生数据的单链表。
#include/*包含NULL的定义*/#include#defineN3structstudent/*结构体类型定义*/longnum;floatscore;structstudent*next;/*自引用结构体指针*/;voidmain()C程序设计第十一章结构体与共用体NWPUCCZhangYanChun12voidmain()structstudent*head,*p1,*p2;inti,len;sqrt(5.5);/*TC激活浮点运算*/head=NULL;/*head不指向任何位置*/len=sizeof(structstudent);/*求类型长*/for(i=1;inum,&p1-score);if(i=1)head=p2=p1;/*指向首节点*/elsep2-next=p1;p2=p1;/*节点链接*/if(i=N)p2-next=NULL;/*标记末尾节点*/C程序设计第十一章结构体与共用体NWPUCCZhangYanChun13voidmain()for(i=1;i=N;i+)/*建立链表*/for(i=1;inext;/*p1指向下一节点*/printf(%d:
num=%ld,score=%5.2fn,i,p1-num,p1-score);/*main*/C程序设计第十一章结构体与共用体NWPUCCZhangYanChun14【例】将上题利用函数实现,并求平均成绩。
定义如下函数:
定义如下函数:
建立链表函数:
structstudent*create(void);输出链表函数:
voidplink(structstudent*head);求平均值函数:
floataverf(structstudent*head);函数间信息传递:
函数间信息传递:
主函数createplinkaverf无参头指针头指针无返回值平均值头指针C程序设计第十一章结构体与共用体NWPUCCZhangYanChun15#include#include#defineN3structstudent/*全局结构类型*/longnum;floatscore;structstudent*next;voidmain()C程序设计第十一章结构体与共用体NWPUCCZhangYanChun16voidmain()structstudent*head,*create(void);voidplink(structstudent*head);floataverf(structstudent*head);inti,len;floataver;sqrt(5.5);clrscr();/*TC中使用head=NULL;head=create();/*返回链表头指针*/plink(head);aver=averf(head);/*返回平均值*/printf(Average=%5.2fn,aver);C程序设计第十一章结构体与共用体NWPUCCZhangYanChun17structstudent*create()structstudent*head,*p1,*p2;inti,len;len=sizeof(structstudent);for(i=1;inum,&p1-score);if(i=1)head=p2=p1;/头节点elsep2-next=p1;p2=p1;/中间节点if(i=N)p2-next=NULL;/尾节点return(head);/返回链表头指针C程序设计第十一章结构体与共用体NWPUCCZhangYanChun18voidplink(structstudent*head)/*输出各节点*/structstduent*p;inti;for(i=1;inext;printf(%d:
num=%ld,score=%5.2fn,i,p-num,p-score);return;PPC程序设计第十一章结构体与共用体NWPUCCZhangYanChun19floataverf(structstudent*head)structstudent*p;floatsum=0;intc=0;p=head;/*使p指向首节点*/while(p!
=NULL)c+;/*c统计节点数*/sum=sum+p-score;p=p-next;return(sum/c);/*返回平均值*/C程序设计第十一章结构体与共用体NWPUCCZhangYanChun2013703.节点的删除节点的删除步骤:
步骤:
1)从头节点开始按查找关键字查找要删除的节点;2)找到,则将要删除节点的“链节”成员赋给前一节点的“链节”成员,使删除的节点脱离链表。
若:
要删除节点为首节点,则将首节点“链节”成员赋给链头指针变量。
3)释放已被删除节点占用的空间。
10481012210189.51370head2304901012pNULL10482918851012C程序设计第十一章结构体与共用体NWPUCCZhangYanChun21【例】按上例删除指定学号的节点structstudent*del(structstudent*head,longn)structstudent*p1,*p2;/*n:
要删除学号*/p1=head;if(p1-num=n)head=p1-next;/*删除首节点*/elsedop2=p1;p1=p1-next;/*继续找*/while(p1!
=NULL&p1-num!
=n);if(p1-num=n)p2-next=p1-next;/*找到*/elseprintf(Notbefound!
n);/*未找到*/free(p1);/*释放被删除节点的存储区*/return(head);/*返回头指针*/C程序设计第十一章结构体与共用体NWPUCCZhangYanChun22voidplink(structstudent*head)/*更具通用性*/structstudent*p;p=head;while(p!
=NULL)printf(num=%ld,score=%5.2fn,p-num,p-score);p=p-next;return;注:
注:
本形式的链表输出函数具有通用性,可适应由于删除或插入节点引起的链表长度的变化。
C程序设计第十一章结构体与共用体NWPUCCZhangYanChun234.节点的插入节点的插入插入可分为随意
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 链表
![提示](https://static.bdocx.com/images/bang_tan.gif)