第二章链表PPT课件下载推荐.ppt

上传人:wj 文档编号:13124667 上传时间:2022-10-06 格式:PPT 页数:104 大小:1.43MB
下载 相关 举报
第二章链表PPT课件下载推荐.ppt_第1页
第1页 / 共104页
第二章链表PPT课件下载推荐.ppt_第2页
第2页 / 共104页
第二章链表PPT课件下载推荐.ppt_第3页
第3页 / 共104页
第二章链表PPT课件下载推荐.ppt_第4页
第4页 / 共104页
第二章链表PPT课件下载推荐.ppt_第5页
第5页 / 共104页
点击查看更多>>
下载资源
资源描述

第二章链表PPT课件下载推荐.ppt

《第二章链表PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《第二章链表PPT课件下载推荐.ppt(104页珍藏版)》请在冰豆网上搜索。

第二章链表PPT课件下载推荐.ppt

头结点:

在链表的首元结点之前附设的一个结点。

头结点的数据域空闲或者存放附加信息(例如表长)。

整个链表通过头指针唯一标识。

数据元素的存取需从头指针开始进行,依次顺着每个结点的指针域找到线性表的各个元素。

因此链表是非随机存取的存储结构,只能实现元素顺序存取。

特点2)链表是一种顺序存取的结构,6,单链表的类型定义:

typedefintElemType;

typedefstructnode/*结点类型定义*/ElemTypedata;

structnode*next;

slink;

图2.8单链表的结点结构,数据域,指针域,7,

(一)相关知识(a)指针的概念,19EB,3,i_pointer,i,地址(i的指针),指针变量,19EB,*i_pointer,2.单链表上的基本运算,8,(b)指针变量的定义inti;

int*i_pointer;

i_pointer=,若:

i=3;

则:

*i_pointer=3;

inti;

*i_pointer=,若:

*i_pointer相当于*(*i_pointer),9,(c)动态存储和释放空间的函数,单链表中的每一个结点都是动态建立的,在增加结点之前要为结点分配存储空间,删除接点之后要释放存储空间。

10,求字节函数sizeof(类型名);

求字节运算符,malloc(sizeof(NODE);

typedefcharelemtype;

typedefstructnodeelemtypedata;

structnode*next;

NODE;

11,强制类型转换malloc()函数返回的是指向字符型数据的指针。

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,数据域,指针域,*p.data,node,node.data,p-data,*p.next,node.next,p-next,14,指针后移操作p=p-next,1475,指向指针的指针NODE*h;

*h,1000,15,初始化操作功能:

创建一个带头结点的空链表L,typedefintElemType;

typedefstructnodeElemTypedata;

slink,*Linklist;

slink*initlist()/*创建一个带头结点的空链表L*/slink*L;

L=(slink*)malloc(sizeof(slink);

if(L=NULL)printf(“OVERFLOW!

”);

exit

(1);

L-next=NULL;

returnL;

(二)相关运算,16,建立单链表,所谓建立链表是指从无到有地建立一个链表,即将线性表的数据元素一一输入,不断产生各结点并建立起前后相链的关系。

根据原始数据输入的顺序不同,算法细节也有所不同,一种是按照原始数据的先后顺序一一输入,新结点在表尾插入,称作尾插法;

另一种是按照原始数据的倒序输入,新结点在头结点后第一个数据元素结点前插入,称作头插法。

17,方法一:

尾插法建表,即将新申请的结点插入到链表的尾部,图2.9尾插法建表图示,r始终指向单链表的表尾,L=initlist();

r=L;

18,开始,N,Y,尾接法创建单链表流程图,19,slink*CreateFromTail()/*从键盘接收整数,数据以-9999结束,尾插法建立带头结点的单链表L*/,while(x!

=-9999)scanf(“%d”,时间性能分析:

O(n),slink*L,*r,*s;

ElemTypex;

/*初始化为空表*/L=initlist();

r=L;

/*r指针始终动态指向链表的当前表尾,其初值指向头结点*/,/*读入一个元素*/scanf(“%d”,/*申请新结点s并赋值*/s=(slink*)malloc(sizeof(slink);

s-data=x;

/*新结点链接到表尾*/r-next=s;

/*更新表尾指针*/r=s;

r-next=NULL;

/*将最后一个结点的next链域置为空,表示链表的结束*/returnL;

20,图2.10头插法建立单链表图示,方法二:

头插法,即将新申请的结点插入到链表的头部,成为元首结点,执行的语句组为:

s-nextL-next;

L-nexts;

L=initlist();

21,开始,N,Y,头接法创建单链表流程图,22,slink*CreateFromHead()/*从键盘接收整数,数据以-9999结束,头插法建立带头结点的单链表L*/,slink*L,*s;

L=initlist();

/*链表L初始化*/,scanf(“%d”,/*读入第一个数据*/*依次插入数据到表头*/,while(x!

=-9999),s=(slink*)malloc(sizeof(slink);

/*为读入的数据分配存储空间*/s-data=x;

s-next=L-next;

L-next=s;

scanf(“%d”,returnL;

23,

(2)求表长操作,算法描述:

可以采用“数”结点的方法来求出单链表的长度,用指针p依次指向各个结点,从第一个元素开始“数”,一直“数”到最后一个结点。

intgetlen(slink*L)/*本算法用来求带头结点单链表L长度*/slink*p;

inti=0;

/*用来存放单链表的长度*/,时间复杂度O(n),1,2,n,=NULL,p=L-next;

while(p!

=NULL),i+;

p=p-next;

returni;

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,intgetelem(slink*L,inti,ElemType*e)/*在带头结点的单链表L中查找第i个结点,若找到(1in),则将该结点的元素值带回,返回1,否则返回0*/,时间复杂度O(n),intj;

slink*p;

if(i1)return0;

=L-next;

j=1;

/*从第一个元素结点开始扫描*/,while(p!

=NULL&

ji),p=p-next;

/*扫描下一结点*/j+;

/*已扫描结点计数*/,if(!

p)return0;

*e=p-data;

return1;

/*找到了第i个结点*/,26,(4)定位操作,查找元素x在单链表L中第1次出现的位置。

找到,则返回结点的位序,否则返回0。

算法思想:

从单链表的第1个结点出发,顺着链逐个将当前结点的值和给定值x作比较。

i,1,x=30,2,3,找到,返回i,x=51,1,6,7,未找到,返回0,27,intlocate(slink*L,ElemTypex)/*查找元素x在单链表L中第1次出现的位置。

*/,时间复杂度:

O(n),a.返回位序,slink*p;

inti;

p=L-next;

/*从表中第一个结点比较*/i=1;

while(p!

p-data!

=x),p=p-next;

i+;

if(p!

=NULL)returni;

/*找到*/return0;

/*未找到*/,28,b.返回前驱,voidLocate(LinklistL,elemtypex,Linklist*pprior,Linklist*pself)prior=L,self=L-next;

while(self,相当于slink*L,29,c.无序表在给定的链表L中在值x之前插入值为y的元素,若x不存在,则插入尾部,voidinserty(LinklistL,elemtypex,elemtypey)Locate(L,x,30,d.在有序链表中定位值为x的元素的插入位置.,voidlocatex(LinklistL,elemtypex,Linklist*PPrior)p=L;

while(p-next,31,e.在升序的链表中插入值为x的元素,voidinsertx(LinklistL,elemtypex)Locatex(L,x,32,(5)插入操作在第i个结点前插入元素x。

图2.11在单链表第i个结点前插入一个结点的过程,33,开始,N,Y,单链表插入算法流程图:

申请到新结点,Y,N,N,Y,34,intinsert(slink*L,inti,ElemTypex)/*在带头结点的单链表L中第i个位置插入值为x的新结点,成功返回1,失败返回0*/slink*p,*s;

intj;

p=L;

j=0;

/*找到第i-1个数据元素的存储位置,使指针p指向它*/while(p!

=NULL,35,/*修改指针,完成插入操作*/q-next=p-next;

p-next=q;

return1;

/*插入成功,返回1*/,性能分析:

时间主要花费在查找结点上时间复杂度O(n)。

36,(6)删除操作,图2.12单链表的删除过程,(a)寻找第i-1个结点令p指向它,删除带头结点单链表中第i个结点。

(b)删除并释放第i个结点,37,开始,N,Y,单链表删除算法流程图,找到要删除的元素否?

Y,N,38,intdelete(slink*L,inti,ElemType*e)/*在带头结点的单链表L中删除第i个元素,成功返回1并通过参数e带回已删结点的值,失败返回0*/slink*p,*q;

/*寻找被删除结点i的前驱结点i-1使p指向它*/while(p-next!

=NULL,39,q=p-next;

/*q指向第i个结点*/p-next=q-next;

/*删除结点q*/*e=q-data;

free(q);

/*释放被删除的结点所占的内存空间*/return1;

性能分析:

时间主要花费在查找结点上,时间复杂度是O(n)。

40,(7)输出操作,voidprint

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

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

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