【教学课件】第2章数据结构线性表.ppt
《【教学课件】第2章数据结构线性表.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第2章数据结构线性表.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章 线性表 陈守孔陈守孔 孟佳娜孟佳娜 陈卓陈卓本章目录w2.1 线性表的类型定义线性表的类型定义 n2.1.1 线性表的概念线性表的概念 n2.1.2 线性表的抽象数据类型线性表的抽象数据类型w 2.2 线性表的顺序表示和实现线性表的顺序表示和实现 n2.2.1 线性表的顺序表示线性表的顺序表示 n2.2.2 顺序表上基本运算的实现顺序表上基本运算的实现w2.3 线性表的链式表示和实现线性表的链式表示和实现 n2.3.1 单链表的表示单链表的表示 n2.3.2 单链表操作的实现单链表操作的实现w2.4 线性表实现方法的比较线性表实现方法的比较w2.5 循环链表循环链表w2.6 双链表双链
2、表w2.7 静态链表静态链表 (*2.8 算法设计举例)算法设计举例)主要内容 w知识点知识点n线性表的定义线性表的定义n顺序表顺序表n单链表单链表n双链表双链表n静态链表静态链表w重点难点重点难点n顺序表操作的实现顺序表操作的实现n单链表操作的实现单链表操作的实现n顺序表和链表操作时间复杂度的分析顺序表和链表操作时间复杂度的分析n静态链表静态链表线性结构w在数据元素的非空的有限集合中:在数据元素的非空的有限集合中:n存在唯一的一个被称为存在唯一的一个被称为“第一个第一个”的数的数据元素;据元素;n存在唯一的一个被称为存在唯一的一个被称为“最后一个最后一个”的的数据元素;数据元素;n除第一个元
3、素外,集合中每个元素都有除第一个元素外,集合中每个元素都有且仅有且仅有一个前驱一个前驱;n除最后一个元素外,集合中每个元素都除最后一个元素外,集合中每个元素都有且仅有有且仅有一个后继一个后继;线性表(Linear List)定义w定义:定义:n个具有相同特性的数据元素组成的有限序列;w表示:表示:a1,ai-1,ai,ai+1,anwai必须具有相同特性,即属于同一数据对象wai-1是ai的直接前驱元素,ai+1是ai的直接后继元素w数据元素ai在线性表中有确定的位置i,i称为位序w线性表中数据元素的个数n称为线性表的长度,n=0时,线性表称为空表抽象数据类型定义ADT List数据对象:数据
4、对象:D=ai|aiElemSet,i=1,2,n,n0数据关系:数据关系:R=|ai,ai-1D,i=2,n基本操作:基本操作:1.ListInit(L);2.ListLength(L);3.ListGet(L,i);4.ListLocate(L,x);5.ListClear(L);6.ListEmpty(L);7.ListPrior(L,e);8.ListNext(L,e);9.ListInsert(L,i,e);10.ListDelete(L,i);ADT List例如例如2.1 2.1 遍历线性表遍历线性表L L ListTraverse(List L,visit()/遍历线性表遍历线
5、性表if(ListEmpty(L)printf(“空表空表n”);else for(i=1;i=ListLength(L);i+)visit(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)&(j
6、=Lb_len)/La和和Lb均非空均非空 ai=ListGet(La,i);bj=ListGet(Lb,j);if(ai=bj)ListInsert(Lc,+k,ai);+i;else ListInsert(Lc,+k,bj);+j;(接下(接下页页)(接上(接上页页)while(i=La_len)/Lb已空,将已空,将La表的剩余部分复制到新表表的剩余部分复制到新表ai=ListGet(La,i+);ListInsert(Lc,+k,ai);while(j=Lb_len)/La已空,将已空,将Lb表的剩余部分复制到新表表的剩余部分复制到新表bj=ListGet(Lb,j+);ListIns
7、ert(Lc,+k,bj);return(Lc);/ListMerge例2.2 合并线性表合并线性表逻辑结构是本质 通过上面两个例子可以看出:w逻辑结构是数据组织的某种“本质性”的东西:(1)逻辑结构与数据元素本身的)逻辑结构与数据元素本身的形式、内容形式、内容无关。无关。(2)逻辑结构与数据元素的)逻辑结构与数据元素的相对位置相对位置无关。无关。(3)逻辑结构与所含数据元素的)逻辑结构与所含数据元素的个数个数无关。无关。w算法的设计取决于选定的逻辑结构,算法的设计取决于选定的逻辑结构,而算法的实现依赖于采用的存储结构而算法的实现依赖于采用的存储结构 线性表的顺序表示和实现 线性表的顺序表示线
8、性表的顺序表示:线性表的顺序存储是指在内存中用线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为这种存储形式存储的线性表称为顺序表顺序表。设设 a a的存储地址为的存储地址为Loc(aLoc(a),每个数据元素占,每个数据元素占L L个存个存储单元,则第储单元,则第i i个数据元素的地址为:个数据元素的地址为:Loc(a Loc(ai i)=Loc(a)=Loc(a1 1)+(i)+(i-1)*L 11)*L 1i in n 0 1 i-1 i n-1 MAXSIZE-1 a a1 1a a
9、2 2a ai ia an ndatadataa ai-1i-1a ai+1i+1顺序存储结构的线性表的类型定义如下:顺序存储结构的线性表的类型定义如下:#define MAXSIZE 100 顺序表的最大容量顺序表的最大容量typedef structElemType dataMAXSIZE;存放线性表的数组存放线性表的数组int last;last是线性表的长度是线性表的长度SeqList;顺序表上基本运算的实现(1)SeqList SeqListInit(SeqList L)/构造一个空的顺序表构造一个空的顺序表 L.length=0;/初始化顺序表初始化顺序表为空表为空表 return
10、 L;顺序表的初始化顺序表的初始化:顺序表上基本运算的实现(2)插入运算插入运算:在第在第 i 个位置,插入元素个位置,插入元素e思想:思想:把从第把从第i个位置开始的元素,依次后个位置开始的元素,依次后移移步骤:步骤:1.当前表是否已经满?当前表是否已经满?2.输入是否有效?输入是否有效?3.插入元素。插入元素。顺序表上基本运算的实现(2)w SeqList SeqListInsert(SeqList L,int i,ElemType x)w在顺序表中的第在顺序表中的第 i 个位置插入元素个位置插入元素 x wif(L.Last=MAXSIZE)wprintf(表满表满n);exit(0);
11、表满,退出表满,退出wif(iL.Last+1)wprintf(插入位置错插入位置错n);exit(0);插入位置错,退出插入位置错,退出w for(j=L.Last-1;j=i-1;j-)w L.dataj+1=L.dataj;w 第第i个位置后的数组元素逐一后移个位置后的数组元素逐一后移 w L.datai-1=x;新元素插入到第新元素插入到第i个位置个位置w L.Last+;顺序表长度增顺序表长度增1w return(L);返回插入元素后的顺序表返回插入元素后的顺序表w 顺序表插入元素算法分析w插入运算的基本操作是移动数据。在第插入运算的基本操作是移动数据。在第i(1in+1)个位置上插
12、入)个位置上插入x,需要移动,需要移动n-i+1个个元素。元素。w设在第设在第i个位置上作插入的概率为个位置上作插入的概率为 pi,则平均移,则平均移动数据元素的次数(期望值)为动数据元素的次数(期望值)为 w设:设:pi=1/(n+1),即为等概率情况,则:,即为等概率情况,则:pi=n/2,约需移动表中一半的数据元素。约需移动表中一半的数据元素。时间复杂度:时间复杂度:O(n)顺序表上基本运算的实现(3)删除运算删除运算:删除第删除第 i 个元素个元素e思想:思想:把第把第i1个位置开始的元素,依次个位置开始的元素,依次前移前移步骤:步骤:1.要检查删除位置的有效性;要检查删除位置的有效性
13、;2.依次移动元素;依次移动元素;3.长度减长度减1。顺序表上基本运算的实现(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)删除元素删除元素:顺序表删除元素算法分析w主要操作是移动元素。删除第主要操作是移动元素。删
14、除第i个元素时,个元素时,向前移动向前移动n-i 个元素个元素w平均移动元素次数的期望值平均移动元素次数的期望值:w 在等概率情况下,在等概率情况下,pi=1/n,则:,则:Edel=(n-1)/2,所以顺序表上的删除运算约需要移动所以顺序表上的删除运算约需要移动表中一半的元素。表中一半的元素。时间复杂度:时间复杂度:O(n)顺序表上基本运算的实现(4)int SeqListLocate(SeqList L,ElemType x)/在顺序表在顺序表L中查找第一个与中查找第一个与x值相等的元素。若值相等的元素。若查找成功,则返回它在顺序表中的位序;否则,查找成功,则返回它在顺序表中的位序;否则,
15、返回返回0。i=1;while(i=L.last&L.datai-1!=x)i+;if(i=0&j=0)if(LA.datai=LB.dataj)LA.datak-=LA.datai-;else LA.datak-=LB.dataj-;while(j=0)LA.datak-=LB.dataj-;LA.last=m+n;顺序表算法举例(续)请写一个算法将顺序表(请写一个算法将顺序表(a1,.,an)逆置为)逆置为(an,.,a1)。void SeqInvert(ElemType a,int n)/a是具有是具有n个元素的顺序表,本算法将其逆置。个元素的顺序表,本算法将其逆置。for(i=0;id
16、ata p-next 线性链表操作的实现(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;/p指向第一结点指向第一结点 j=0;while(p
17、)j+;p=p-next;/移移动动p指向下一结点指向下一结点 return j;求表长求表长:线性链表操作的实现(3)LinkedList LinkedListGet(LinkedList L,int i);/在单链表在单链表L中查找第中查找第i个元素结点,返回该结点,否个元素结点,返回该结点,否则返回空则返回空 if(inext;j=1;while(p!=NULL&jnext;j+;if(j=i)return p;else return NULL;取第取第i i个元素个元素:线性链表操作的实现(4)LinkedList LinkedListLocate(LinkedList L,ElemT
18、ype x)/在单链表在单链表L中查找值为中查找值为x的结点,找到后返回其指针,的结点,找到后返回其指针,否则返回空否则返回空 p=L-next;while(p!=NULL&p-data!=x)p=p-next;if(!p)printf(“无无值为值为X的的结结点点”);return null;else return p;按值查找按值查找:线性链表操作的实现(5)LinkedList LinkedListLocate(LinkedList L,LNode*p)/在单链表在单链表L中求中求p指向的结点指向的结点(假定存在)的前驱假定存在)的前驱 if(L-next=p)printf(“p指向第一
19、元素结点,无前驱指向第一元素结点,无前驱”);exit(0);pre=L;while(pre!=NULL&pre-next!=p)pre=pre-next;if(pre)return pre;else return null;查找结点的前驱查找结点的前驱:线性链表操作的实现(6)LinkedList LinkedListLocate(LinkedList L,LNode*p)/在单链表在单链表L中求中求p指向的结点指向的结点(假定存在)的后继假定存在)的后继 pre=L;while(pre!=NULL&pre-next!=p)pre=pre-next;if(p-next=null)printf
20、(“p指向最后元素结点,无后继指向最后元素结点,无后继”);exit(0);else return p;查找结点的后继查找结点的后继:线性链表操作的实现(7)p表示当前结点,表示当前结点,pre表示前一个结点表示前一个结点(的指的指针针)。在在p前插入元素前插入元素ss-next =pre-next;pre-next=s;aknext插入元素:插入元素:ai-1nextainextpre线性链表操作的实现(7)插入算法插入算法:void LinkedListInsert(LinkedList L,LNode*p,ElemType x)/在结点在结点p之前插入元素为之前插入元素为x的结点的结点p
21、re=L;while(pre!=NULL&pre-next!=p)pre=pre-next;/找找p的直接前驱的直接前驱 if(!pre)printf(“不存在不存在*p结点结点”);exit(0);s=(LNode*)malloc(sizeof(LNode);/创建新结点创建新结点 s-data=x;/设置新结点的元素值设置新结点的元素值 s-next=pre-next;pre-next=s;/插入新结点插入新结点线性链表操作的实现(8)p表示当前结点,表示当前结点,pre表示前一个结点。表示前一个结点。pre-next=p-next;free(p);/p=pre-next;删除元素删除元素
22、:ai-1nextainextai+1next线性链表操作的实现(8)删除元素删除元素:void LinkedListDel(LinkedList L,int i)/删除单链表删除单链表L上的第上的第i个结点个结点 if(inext&jnext;j+if(p-next=NULL|ji)printf(“删除位置不正确删除位置不正确”);exit(0);q=p-next;p-next=q-next;/从链表中删除从链表中删除 free(q);/释放被删除结点释放被删除结点 线性链表操作的实现(9)建立单链表头插法建立单链表头插法:L36L3645L103645L23103645L364510236
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 数据结构 线性
限制150内