【教学课件】第2章数据结构线性表.ppt
《【教学课件】第2章数据结构线性表.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第2章数据结构线性表.ppt(73页珍藏版)》请在三一办公上搜索。
1、第二章 线性表,陈守孔 孟佳娜 陈卓,本章目录,2.1 线性表的类型定义 2.1.1 线性表的概念 2.1.2 线性表的抽象数据类型 2.2 线性表的顺序表示和实现 2.2.1 线性表的顺序表示 2.2.2 顺序表上基本运算的实现2.3 线性表的链式表示和实现 2.3.1 单链表的表示 2.3.2 单链表操作的实现2.4 线性表实现方法的比较2.5 循环链表2.6 双链表2.7 静态链表(*2.8 算法设计举例),主要内容,知识点线性表的定义顺序表单链表双链表静态链表重点难点顺序表操作的实现单链表操作的实现顺序表和链表操作时间复杂度的分析静态链表,线性结构,在数据元素的非空的有限集合中:存在唯
2、一的一个被称为“第一个”的数据元素;存在唯一的一个被称为“最后一个”的数据元素;除第一个元素外,集合中每个元素都有且仅有一个前驱;除最后一个元素外,集合中每个元素都有且仅有一个后继;,线性表(Linear List)定义,定义:n个具有相同特性的数据元素组成的有限序列;表示:a1,ai-1,ai,ai+1,anai必须具有相同特性,即属于同一数据对象ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素数据元素ai在线性表中有确定的位置i,i称为位序线性表中数据元素的个数n称为线性表的长度,n=0时,线性表称为空表,抽象数据类型定义,ADT List数据对象:D=ai|aiElemSet,
3、i=1,2,n,n0数据关系:R=|ai,ai-1D,i=2,n基本操作:ListInit(L);ListLength(L);ListGet(L,i);ListLocate(L,x);ListClear(L);ListEmpty(L);ListPrior(L,e);ListNext(L,e);ListInsert(L,i,e);ListDelete(L,i);ADT List,例如2.1 遍历线性表L,ListTraverse(List L,visit()/遍历线性表if(ListEmpty(L)printf(“空表n”);else for(i=1;i=ListLength(L);i+)vis
4、it(ListGet(L,i);,例2.2 合并线性表,List ListMerge(List La,List Lb)/La和Lb是两个非递减有序的线性表,将线性表La和Lb合并成一个新的线性表Lc,Lc也非递减有序。ListInit(Lc);i=j=1;k=0;La_len=ListLength(La);Lb_len=ListLength(Lb);while(i=La_len)(接下页),(接上页)while(i=La_len)/Lb已空,将La表的剩余部分复制到新表ai=ListGet(La,i+);ListInsert(Lc,+k,ai);while(j=Lb_len)/La已空,将Lb
5、表的剩余部分复制到新表bj=ListGet(Lb,j+);ListInsert(Lc,+k,bj);return(Lc);/ListMerge,例2.2 合并线性表,逻辑结构是本质,通过上面两个例子可以看出:逻辑结构是数据组织的某种“本质性”的东西:(1)逻辑结构与数据元素本身的形式、内容无关。(2)逻辑结构与数据元素的相对位置无关。(3)逻辑结构与所含数据元素的个数无关。算法的设计取决于选定的逻辑结构,而算法的实现依赖于采用的存储结构,线性表的顺序表示和实现,线性表的顺序表示:线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表。设
6、 a的存储地址为Loc(a),每个数据元素占L个存储单元,则第i个数据元素的地址为:Loc(ai)=Loc(a1)+(i-1)*L 1in,顺序存储结构的线性表的类型定义如下:#define MAXSIZE 100 顺序表的最大容量typedef structElemType dataMAXSIZE;存放线性表的数组int last;last是线性表的长度SeqList;,顺序表上基本运算的实现(1),SeqList SeqListInit(SeqList L)/构造一个空的顺序表 L.length=0;/初始化顺序表为空表 return L;,顺序表的初始化:,顺序表上基本运算的实现(2),
7、插入运算:在第 i 个位置,插入元素e思想:把从第i个位置开始的元素,依次后移步骤:1.当前表是否已经满?2.输入是否有效?3.插入元素。,顺序表上基本运算的实现(2),SeqList SeqListInsert(SeqList L,int i,ElemType x)在顺序表中的第 i 个位置插入元素 x if(L.Last=MAXSIZE)printf(表满n);exit(0);表满,退出if(iL.Last+1)printf(插入位置错n);exit(0);插入位置错,退出 for(j=L.Last-1;j=i-1;j-)L.dataj+1=L.dataj;第i个位置后的数组元素逐一后移
8、L.datai-1=x;新元素插入到第i个位置 L.Last+;顺序表长度增1 return(L);返回插入元素后的顺序表,顺序表插入元素算法分析,插入运算的基本操作是移动数据。在第i(1in+1)个位置上插入x,需要移动n-i+1个元素。设在第i个位置上作插入的概率为 pi,则平均移动数据元素的次数(期望值)为 设:pi=1/(n+1),即为等概率情况,则:pi=n/2,约需移动表中一半的数据元素。,时间复杂度:,O(n),顺序表上基本运算的实现(3),删除运算:删除第 i 个元素e思想:把第i1个位置开始的元素,依次前移步骤:1.要检查删除位置的有效性;2.依次移动元素;3.长度减1。,顺
9、序表上基本运算的实现(3),void SeqListDelete(SeqList L,int i)/删除顺序表中的第i个元素 if(iL.last)printf(“位置非法”)exit(0);/检查空表及删除位置的合法性 for(j=i;j=L.last-1;j+)L.dataj-1=L.dataj;/向上移动 L.last-;/顺序表长度减1,时间复杂度:,O(n),删除元素:,顺序表删除元素算法分析,主要操作是移动元素。删除第i个元素时,向前移动n-i 个元素平均移动元素次数的期望值:在等概率情况下,pi=1/n,则:Edel=(n-1)/2,所以顺序表上的删除运算约需要移动表中一半的元素
10、。,时间复杂度:,O(n),顺序表上基本运算的实现(4),int SeqListLocate(SeqList L,ElemType x)/在顺序表L中查找第一个与x值相等的元素。若查找成功,则返回它在顺序表中的位序;否则,返回0。i=1;while(i=L.last/查找失败,按值查找:,顺序表算法举例,顺序结构线性表LA与LB的结点关键字为整数。LA与LB的元素按非递减有序,线性表空间足够大。试用类C语言给出一种高效算法,将LB中元素合到LA中,使新的LA的元素仍保持非递减有序。高效指最大限度的避免移动元素。,顺序表算法举例(续),void Union(SeqList LA,LB)/LA和L
11、B是顺序存储的线性表,元素按非递减有序排列,本算法将LB合并到LA中,元素仍非递减有序。m=LA.last;n=LB.last;/m,n分别为线性表LA和LB的长度。k=m+n-1;/k为结果线性表的工作指针(下标)i=m-1;j=n-1;/i,j分别为线性表LA和LB的工作指针(下标)while(i=0,顺序表算法举例(续),请写一个算法将顺序表(a1,.,an)逆置为(an,.,a1)。,void SeqInvert(ElemType a,int n)/a是具有n个元素的顺序表,本算法将其逆置。for(i=0;i=(n-1)/2;i+)t=ai;ai=an-1-i;an-1-i=t;/算法
12、结束 算法中循环控制变量的初值和终值是关键。C中数组从下标0开始,第n个元素的下标是n-1。因为首尾对称交换,所以控制变量的终值是线性表长度的一半。,线性表的链式表示和实现,以链式结构存储的线性表称之为线性链表。线性表中的数据元素可以用任意的存储单元来存储,逻辑相邻的两元素的存储空间可以是不连续的。为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储其后继的地址(即用指针表示逻辑关系)。这两部分信息组成数据元素的存储映象,称为结点。,可以认为利用小的零散空间“串”起来,表示线性表,即把线性表的元素分散插入到系统所控制的零散空间中,然后用“指针”串起来,组成一个有序的线性表,
13、用指针表示数据元素的逻辑关系。元素的存储,可以是连续的,也可以不是连续的。结点至少包括数据元素和指针两个区域。,线性表的链式表示,单链表结构图示,链表,结点ai,单链表结构图示,单链表的头指针为H:LinkedList H;,单链表结点的类型定义,结点定义:typedef struct Node ElemType data;struct Node*next;LNode,*LinkedList;,几个概念:结点,首元结点,第一元素结点,头结点,指针,头指针,带头结点的单链表,通常情况下,为了运算的统一,常在第一个结点前附设一个结点,称为“头结点”,头指针具有标识作用,因而,常用作链表的名字,LN
14、ode*p;p=(LNode*)malloc(sizeof(LNode);则完成了申请一块LNode类型的存储单元的操作,并将其地址赋值给变量p。,线性链表操作的实现(1),LinkedList LinkedListInit()/建立一个空的单链表 L=(LNode*)malloc(sizeof(LNode);if(L=null)printf(“无内存空间可分配”);exit(0);L-next=NULL;return L;,带头结点的单链表的初始化:,线性链表操作的实现(2),int LinkedListLength(LinkedList L)/求带头结点的单链表的长度 p=L-next;/
15、p指向第一结点 j=0;while(p)j+;p=p-next;/移动p指向下一结点 return j;,求表长:,线性链表操作的实现(3),LinkedList LinkedListGet(LinkedList L,int i);/在单链表L中查找第i个元素结点,返回该结点,否则返回空 if(inext;j=1;while(p!=NULL,取第i个元素:,线性链表操作的实现(4),LinkedList LinkedListLocate(LinkedList L,ElemType x)/在单链表L中查找值为x的结点,找到后返回其指针,否则返回空 p=L-next;while(p!=NULL,按
16、值查找:,线性链表操作的实现(5),LinkedList LinkedListLocate(LinkedList L,LNode*p)/在单链表L中求p指向的结点(假定存在)的前驱 if(L-next=p)printf(“p指向第一元素结点,无前驱”);exit(0);pre=L;while(pre!=NULL,查找结点的前驱:,线性链表操作的实现(6),LinkedList LinkedListLocate(LinkedList L,LNode*p)/在单链表L中求p指向的结点(假定存在)的后继 pre=L;while(pre!=NULL,查找结点的后继:,线性链表操作的实现(7),p表示当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 数据结构 线性
链接地址:https://www.31ppt.com/p-5658343.html