ImageVerifierCode 换一换
格式:PPT , 页数:104 ,大小:1.43MB ,
资源ID:193526      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/193526.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第二章链表.ppt)为本站会员(wj)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第二章链表.ppt

1、1,特点:1)用一组地址任意的存储单元存放线性表中的数据元素。以“结点的序列”表示线性表。,2.3链表线性表的链式存储结构 用链式存储结构存储的线性表,用结点表示数据元素 元素+指针=结点数据域:元素本身信息指针域:指示直接后继(直接前驱)的存储位置,通过指针体现数据之间的次序关系。,2,2.3.1单链表,1、单链表定义,图2.4 单链表的结点结构,数据域,指针域,定义:结点中只含一个指针域的链表称作单链表。,例如:已知线性表(A,B,C,D,E,F,G,H)的单链表存储结构如图2.5所示,它的逻辑状态可以用图2.6描述。,3,图2.5 单链表的示例图,图2.6 单链表的逻辑状态,4,以线性表

2、中第一个数据元素 的存储地址作为线性表的地址,称作线性表的头指针。,头结点,头指针,头指针,有时为了操作方便,在第一个结点之前虚加一个“头结点”,以指向头结点的指针为链表的头指针。,空指针,线性表为空表时,头结点的指针域为空,5,头结点:在单链表第一个结点前附设一个结点叫,头结点,图2.7带头结点的单链表示意图,头指针:指向链表中第一个结点的指针。头结点:在链表的首元结点之前附设的一个结点。头结点的数据域空闲或者存放附加信息(例如表长)。,整个链表通过头指针唯一标识。数据元素的存取需从头指针开始进行,依次顺着每个结点的指针域找到线性表的各个元素。因此链表是非随机存取的存储结构,只能实现元素顺序

3、存取。,特点 2)链表是一种顺序存取的结构,6,单链表的类型定义:,typedef int ElemType;typedef struct node/*结点类型定义*/ElemType data;struct node*next;slink;,图2.8 单链表的结点结构,数据域,指针域,7,(一)相关知识(a)指针的概念,19EB,3,i_pointer,i,地址(i的指针),指针变量,19EB,*i_pointer,2.单链表上的基本运算,8,(b)指针变量的定义 int i;int*i_pointer;i_pointer=,若:i=3;则:*i_pointer=3;,int i;int*i

4、_pointer;*i_pointer=,若:i=3;则:*i_pointer=3;,*i_pointer相当于*(*i_pointer),9,(c)动态存储和释放空间的函数,单链表中的每一个结点都是动态建立的,在增加结点之前要为结点分配存储空间,删除接点之后要释放存储空间。,10,求字节函数 sizeof(类型名);,求字节运算符,malloc(sizeof(NODE);,typedef char elemtype;typedef struct node elemtype data;struct node*next;NODE;,11,强制类型转换 malloc()函数返回的是指向字符型数据的

5、指针。,typedef char elemtype;typedef struct node elemtype data;struct node*next;NODE;,NODE*p;p=malloc(sizeof(NODE);,p=(NODE*)malloc(sizeof(NODE);,12,(d)运算函数和操作,p=(NODE*)malloc(sizeof(NODE),申请一个结点空间,p存放此空间的地址,Free(p),释放p指向结点的空间,P=q,P指向 q所指空间,P=q-next,p=p-next,13,(*p).next=p-next 当指针p指向一个结构体变量时:,*p,数据域,指

6、针域,*p.data,node,node.data,p-data,*p.next,node.next,p-next,14,指针后移操作 p=p-next,1475,指向指针的指针 NODE*h;,*h,1000,15,初始化操作功能:创建一个带头结点的空链表L,typedef int ElemType;typedef struct node ElemType data;struct node*next;slink,*Linklist;,slink*initlist()/*创建一个带头结点的空链表L*/slink*L;L=(slink*)malloc(sizeof(slink);if(L=NUL

7、L)printf(“OVERFLOW!”);exit(1);L-next=NULL;return L;,(二)相关运算,16,建立单链表,所谓建立链表是指从无到有地建立一个链表,即将线性表的数据元素一一输入,不断产生各结点并建立起前后相链的关系。根据原始数据输入的顺序不同,算法细节也有所不同,一种是按照原始数据的先后顺序一一输入,新结点在表尾插入,称作尾插法;另一种是按照原始数据的倒序输入,新结点在头结点后第一个数据元素结点前插入,称作头插法。,17,方法一:尾插法建表,即将新申请的结点插入到链表的尾部,图2.9 尾插法建表图示,r始终指向单链表的表尾,L=initlist();r=L;,18

8、,开始,N,Y,尾接法创建单链表流程图,19,slink*CreateFromTail()/*从键盘接收整数,数据以-9999结束,尾插法建立带头结点的单链表L*/,while(x!=-9999)scanf(“%d”,时间性能分析:O(n),slink*L,*r,*s;ElemType x;/*初始化为空表*/L=initlist();,r=L;/*r指针始终动态指向链表的当前表尾,其初值指向头结点*/,/*读入一个元素*/scanf(“%d”,/*申请新结点s并赋值*/s=(slink*)malloc(sizeof(slink);s-data=x;,/*新结点链接到表尾*/r-next=s;

9、/*更新表尾指针*/r=s;,r-next=NULL;/*将最后一个结点的next链域置为空,表示链表的结束*/return L;,20,图2.10 头插法建立单链表图示,方法二:头插法,即将新申请的结点插入到链表的头部,成为元首结点,执行的语句组为:s-nextL-next;L-nexts;,L=initlist();,21,开始,N,Y,头接法创建单链表流程图,22,slink*CreateFromHead()/*从键盘接收整数,数据以-9999结束,头插法建立带头结点的单链表L*/,slink*L,*s;ElemType x;L=initlist();/*链表L初始化*/,scanf(“

10、%d”,/*读入第一个数据*/*依次插入数据到表头*/,while(x!=-9999),s=(slink*)malloc(sizeof(slink);/*为读入的数据分配存储空间*/s-data=x;,s-next=L-next;L-next=s;,scanf(“%d”,return L;,23,(2)求表长操作,算法描述:可以采用“数”结点的方法来求出单链表的长度,用指针p依次指向各个结点,从第一个元素开始“数”,一直“数”到最后一个结点。,int getlen(slink*L)/*本算法用来求带头结点单链表L长度*/slink*p;int i=0;/*用来存放单链表的长度*/,时间复杂度O

11、(n),1,2,n,=NULL,p=L-next;while(p!=NULL),i+;p=p-next;,return i;,24,(3)取元素操作,取得单链表L的第i个元素的值,并通过参数e带回。,j,1,2,3,例:分别取出表中i=3和i=15的元素,算法描述:从链表第一个元素结点开始顺着链域逐个向后扫描,当ji并且p非空时,p后移,j+;当j=i时,指针p所指的结点就是要找的第i个结点,取得其值并返回1,若p=NULL,未找到返回0。,1,i=3,i=15,6,7,j-计数器(初值为1),累计当前扫描过的结点数p-始终指向第j个数据元素,25,int getelem(slink*L,in

12、t i,ElemType*e)/*在带头结点的单链表L中查找第i个结点,若找到(1in),则将该结点的元素值带回,返回1,否则返回0*/,时间复杂度O(n),int j;slink*p;if(i1)return 0;,=L-next;j=1;/*从第一个元素结点开始扫描*/,while(p!=NULL&ji),p=p-next;/*扫描下一结点*/j+;/*已扫描结点计数*/,if(!p)return 0;,*e=p-data;return 1;/*找到了第i个结点*/,26,(4)定位操作,查找元素x在单链表L中第1次出现的位置。找到,则返回结点的位序,否则返回0。算法思想:从单链表的第1个

13、结点出发,顺着链逐个将当前结点的值和给定值x作比较。,i,1,x=30,2,3,找到,返回i,x=51,1,6,7,未找到,返回0,27,int locate(slink*L,ElemType x)/*查找元素x在单链表L中第1次出现的位置。找到,则返回结点的位序,否则返回0。*/,时间复杂度:O(n),a.返回位序,slink*p;int i;p=L-next;/*从表中第一个结点比较*/i=1;,while(p!=NULL&p-data!=x),p=p-next;i+;,if(p!=NULL)return i;/*找到*/return 0;/*未找到*/,28,b.返回前驱,void Lo

14、cate(Linklist L,elemtype x,Linklist*pprior,Linklist*pself)prior=L,self=L-next;while(self,相当于slink*L,29,c.无序表在给定的链表L中在值x之前插入值为y的元素,若x不存在,则插入尾部,void inserty(Linklist L,elemtype x,elemtype y)Locate(L,x,30,d.在有序链表中定位值为x的元素的插入位置.,void locatex(Linklist L,elemtype x,Linklist*PPrior)p=L;while(p-next,31,e.在升

15、序的链表中插入值为x的元素,void insertx(Linklist L,elemtype x)Locatex(L,x,32,(5)插入操作 在第i个结点前插入元素x。,图2.11 在单链表第i个结点前插入一个结点的过程,33,开始,N,Y,单链表插入算法流程图:,申请到新结点,Y,N,N,Y,34,int insert(slink*L,int i,ElemType x)/*在带头结点的单链表L中第i个位置插入值为x的新结点,成功返回1,失败返回0*/slink*p,*s;int j;p=L;j=0;/*找到第i-1个数据元素的存储位置,使指针p指向它*/while(p!=NULL,35,/

16、*修改指针,完成插入操作*/q-next=p-next;p-next=q;return 1;/*插入成功,返回1*/,性能分析:时间主要花费在查找结点上 时间复杂度O(n)。,36,(6)删除操作,图2.12 单链表的删除过程,(a)寻找第i-1个结点令p指向它,删除带头结点单链表中第i个结点。,(b)删除并释放第i个结点,37,开始,N,Y,单链表删除算法流程图,找到要删除的元素否?,Y,N,38,int delete(slink*L,int i,ElemType*e)/*在带头结点的单链表L中删除第i个元素,成功返回1并通过参数e带回已删结点的值,失败返回0*/slink*p,*q;int j;p=L;j=0;/*寻找被删除结点i的前驱结点i-1使p指向它*/while(p-next!=NULL,39,q=p-next;/*q指向第i个结点*/p-next=q-next;/*删除结点q*/*e=q-data;free(q);/*释放被删除的结点所占的内存空间*/return 1;,性能分析:时间主要花费在查找结点上,时间复杂度是O(n)。,40,(7)输出操作,void print

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1