《数据结构》课件第3章(链表).ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《数据结构》课件第3章(链表).ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 链表
- 资源描述:
-
1、第三章第三章 链链 表表 线性链表线性链表 链栈、链队链栈、链队 循环链表循环链表 多重链表多重链表 线性链表线性链表 a1Heada2a3 a4a5a6a7a8地址地址 数据数据 指针指针6462149594327901137991a24212743495990a1a3a7 a6a4a5a86499027594321Head线性表的链式存储结构:线性表的链式存储结构:用一组用一组地址任意地址任意的存储单元存放线性表中的数据元素的存储单元存放线性表中的数据元素结点结点(表示数据元素表示数据元素)=元素元素(数据元素的映象数据元素的映象)+指针指针(指示后继元素存储位置指示后继元素存储位置)链表
2、:链表:以以“结点的序列结点的序列”表示的线性表表示的线性表。ABCD E F G H头结点头结点数据数据域域 指针域指针域链表结点链表结点头指针:头指针:指向链表中第一个结点的指针。指向链表中第一个结点的指针。首元结点首元结点表结点表结点头指针头指针Head1)1)其头指针是指向头结点的非空指针,无论链表是否为其头指针是指向头结点的非空指针,无论链表是否为 空,头指针始终保持值不变,因此头指针的处理方法空,头指针始终保持值不变,因此头指针的处理方法 对空表和非空表的操作是一致的,这与不带头结点的对空表和非空表的操作是一致的,这与不带头结点的 单链表为空时头指针为空不同。单链表为空时头指针为空
3、不同。2)2)首元结点的地址存放在头结点的指针域中,对该结点首元结点的地址存放在头结点的指针域中,对该结点 的操作与其它结点的操作一致,无需进行特殊处理的操作与其它结点的操作一致,无需进行特殊处理(如如 删除首元结点时,对不带头结点的单链表要修改头指删除首元结点时,对不带头结点的单链表要修改头指 针针)。单链表上基本运算的实现单链表上基本运算的实现1)Init_Link(&Head):初始化一个单链表初始化一个单链表void Init_Link(Pointer&Head);Head=new Node;Head-next=null;单链表的类型定义如下:单链表的类型定义如下:typedef st
4、ruct Node ElemType data;struct Node*next;*Pointer;2)Length_Link(Head):返回单链表中所含表结点的个数。返回单链表中所含表结点的个数。int Length_Link(Pointer Head)p=Head;j=0;while(p-Next!=null)p=p-next;j=j+1;return(j);3)Find_Link(Head):返回指向线性表第返回指向线性表第i个结点的指针。个结点的指针。Pointer Find_Link(Pointer Head,int i)p=Head;j=0;while(p-next!=null)
5、&(jnext;j=j+1;if(i=j)return(p);else return(null);4)Locate_Link(Head,x):在单链表中查找值等于在单链表中查找值等于x的结点,的结点,返回指向该结点的指针。返回指向该结点的指针。Pointer Locate_Link(Pointer Head,ElemType x)p=Head-next;while(p!=null)&(p-data!=x)p=p-next;return(p);ABCD x=CHeadp5)Insert_Link(Head,x,i):在单链表的第在单链表的第i个结点之前插入值个结点之前插入值 等于等于x的结点。的
6、结点。void Insert_Link(Pointer&Head,ElemType x,int i)p=Find_Link(Head,i-1);if(p=null)Error(“Without”)else s=new Node;s-data=x;s-next=p-next;p-next=s;ABCD x=F i=3HeadpF S6)Delete_Link(Head,i):删除单链表的第删除单链表的第i个结点。个结点。void Delete_Link(Pointer&Head,int i)p=Find_Link(Head,i-1);if(p!=null)&(p-next!=null)q=p-n
7、ext;p-next=q-next;delete q;else Error(“Without”);ABCD i=3Headp7)Create_Link(Head):建立一个单链表。建立一个单链表。void Create_Link_1(Pointer&Head)Init_Link(Head);scanf(“%c”,&x);i=1;while(x!=*)Insert_Link(head,x,i);i=i+1;scanf(“%c”,&x);void Create_Link_2(Pointer&Head)/顺序顺序 Init_Link(Head);p=Head;scanf(“%c”,&x);while
8、(x!=*)q=new Node;q-data=x;p-next=q;p=q;scanf(“%c”,&x);p-next=null;void Create_Link_3(Pointer&Head)/逆序逆序 p=null;scanf(“%c”,&x);while(x!=*)q=new Node;q-data=x;q-next=p;p=q;scanf(“%c”,&x);Head=new Node;Head-next=p;线性表的链式存储结构的优缺点:线性表的链式存储结构的优缺点:优点:优点:1)1)存储空间动态分配,可以按需要使用;存储空间动态分配,可以按需要使用;2)2)插入插入/删除结点操作
9、时,只需要修改指针,删除结点操作时,只需要修改指针,不必移动数据元素。不必移动数据元素。缺点:缺点:1)1)每个结点需加一指针域,存储密度降低;每个结点需加一指针域,存储密度降低;2)2)非随机存储结构,查找定位操作需要从非随机存储结构,查找定位操作需要从 头指针出发顺着链表扫描。头指针出发顺着链表扫描。单链表的应用示例:单链表的应用示例:例例1.1.将一个单链表逆置将一个单链表逆置void Invert_Link_1(Pointer&Head)/不带头结点不带头结点 p=Head;Head=null;while(p!=null)s=p;p=p-next;s-next=Head;Head=s;
10、Procedure Invert_Link_2(Pointer&Head)/带头结点带头结点 p=Head-next;h=null;while(p!=null)s=p;p=p-next;s-next=h;h=s;Head-next=h;例例2.2.设有带头结点的链表,每个结点有三个域:设有带头结点的链表,每个结点有三个域:datadata,Next,SortNext,Sort,其中,其中,datadata为整型值域,为整型值域,nextnext和和sortsort 均为指针,现所有结点已由均为指针,现所有结点已由nextnext域链接起来,构域链接起来,构 成单链表,试编写利用成单链表,试编写
11、利用sortsort域把所有结点按照值的域把所有结点按照值的 大小链接起来的算法。大小链接起来的算法。算法的思想:算法的思想:1)先构造以先构造以sort域为链表的空表;域为链表的空表;2)依次扫描以依次扫描以next域链接的单链表上的每个结域链接的单链表上的每个结 点,并根据其值将其插入到以点,并根据其值将其插入到以sort域链接的域链接的 链表的合适位置。链表的合适位置。数据类型定义如下:数据类型定义如下:typedef struct Snode int data;Snode*next,sort;*Slist;void LinkList_sort(Slist&Head)Head-sort=
12、null;q=Head-next;while(q!=null)pre=Head;p=pre-sort;while(p!=null)&(q-datap-data)pre=p;p=p-sort;q-sort=p;pre-sort=q;q=q-next;例例2 2:一元多项式的表示及相加。:一元多项式的表示及相加。一元多项式的表示:一元多项式的表示:nnnxPxPxPPxP2210)(),(210nPPPPP可用线性表可用线性表P P表示为:表示为:200001000231)(xxxS 但是对于如下多项式:但是对于如下多项式:一般一般emmnxPxPxPxPee2121)(其中其中为非零系数)(iP
13、emee210用数据域含两个数据项的线性表表示:用数据域含两个数据项的线性表表示:emPePePm,2121其存储结构可以用顺序存储结构,也可以用单链表。其存储结构可以用顺序存储结构,也可以用单链表。则非常浪费存储空间。则非常浪费存储空间。17787172522117)()()(9228)(5937)(xxxxBxAxCxxxxBxxxxA-1A7 0 3 1 9 8 5 17 -1B8 1 22 7 -9 8 -1C7 0 11 1 22 7 5 17 可以采用链式存储结构来表示线性表:可以采用链式存储结构来表示线性表:typedef struct node float coef;int e
14、xp;struct node*next;*polynom;设设p,qp,q分别指向分别指向A,BA,B中某一结点,中某一结点,p,qp,q初值是第一结点初值是第一结点比较比较p-exp与与q-expp-exp exp:p结点是和多项式中的一项结点是和多项式中的一项 p后移后移,q不动不动p-exp q-exp:q结点是和多项式中的一项结点是和多项式中的一项 将将q插在插在p之前之前,q后移后移,p不动不动p-exp=q-exp:系数相加系数相加0:从:从A表中删去表中删去p,释放释放p,q,p,q后移后移 0:修改:修改p系数域系数域,释放释放q,p,q后移后移直到直到p或或q为为NULL 若
展开阅读全文