- 1、本文档共83页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线性表
A:abdghwz i B:bceuy j C:abbcdeghuwyz * 复杂度:根据算法的执行过程,算法访问LA和LB的每个元素有仅只有一次 O(ListLength(LA)+ListLength(LB)) * 分配了一个有限值,如果空间不够可以动态分配增量 * * 问:插入元素时,线性表的逻辑结构发生了什么变化? * 对不合法情况进行分析 1.插入位置最小是多少?为1,最大为多少?n+1(表长加1):i 1 || i L.length+1 2.当前表长跟分配空间一样大时,插入元素会导致数组溢出,所以空间满时不单纯返回一个出错信息,利用数组的空间再分配,增加了一个量,是我们开始设置的增量 * q在前面,p在后面 这是插入算法的主体 q指示插入位置(最后一个元素操作的位置),p指示移动的元素的位置,所以移动基本操作为*(p+1)=*p P的初始值指的是最后一个元素(p = (L.elem[L.length-1])) 再注意一下,c数组下表从0开始,插入最后长度+1 * 问:大家思考一下,时间复杂度是多少 插入算法前面是两个if语句,主体是for循环,基本操作为元素的移动,移动次数显然与插入位置有关 插入位置为i时,移动元素个数是多少?N-i+1(连第i个位置的元素也要移动,因为插入的是第i个元素前面的位置,画图演示) 不仅和位置有关,和表长也有关 位置1是最坏的情况,时间复杂度为n * 概率都是相等的,pi=1/n+1 * 删除第i个元素,用e的值返回 问:删除元素时,线性表的逻辑结构发生了什么变化 * * P在前,q在后 P指示的是被删除的元素的位置((L.elem[i-1])) Q指示的是最后一个元素的位置 e = *p:我们首先用e把p指示的元素返回,之后进行元素移动 每个指针p指示的元素往前移动了一个位置,p的初值为被删除元素后面的一个位置,所以p先加1,然后移动,一直到p的终止到最后一个元素为止 最后表长减1 健壮性: 插入:1.插入的位置不合法。2.表长不够插 删除:1.删除的位置不合法 插入位置从1——n+1,删除为1——n * 控制结构为for循环,基本操作为元素的移动 移动元素的个数和删除的位置有关,也和表长有关 考虑最坏的情况,删除元素位置为第一个,移动n-1个元素 复杂度和表长成正比 * * 顺序表:地址连续的存储单元存放,链表:地址随意 用一个节点表示一个数据元素 以结点的序列表示线性表,称之为链表 * * 头指针的地址表示为链表的地址,用一个指针指示第一个数据元素,这个指针叫做头指针, 头结点:有时候为表示方便,通常在链表前虚加一个结点,包含两部分,数据和指针 不同的是,数据元素的部分没有意义,头指针不再是指示第一个元素,而是指向头结点,如果是空表,头结点的指针域为空 链表C语言表述: 这是一个结点的结构:一个事data,数据域,一个是指针域,next * * GetElem(L,i,*e)取链表中第i个元素 顺序表为随机存取结构,取i个元素非常简单,直接取一维数组中第i-1个分量即可 链表来讲,由指针来指示,要找到第i个元素首先找到第i-1个元素,第i-1个元素的指针域指向第i个元素的数据域,要找到i-1个又要找到i-2个。。。。必须从第一个元素找起 p为指针,j为计数器 所以p始终指向线性表第j个数据元素,j=i时则查找成功 * 这个算法主体为while循环,p指针往后移,计数器j加一,所以基本操作为:使指针P始终指向线性表中第j个数据元素,一直到j的值为i,则p指示的元素为所求 合法性:所求元素位置为1到表长 我们如何知道表长是多少呢?表长是个隐含的值(只有从第一个遍历完才知道多长),因此合法性只能从while循环中找到,p指针不能为空 如果Ji时,p为空,则while循环不成立,表明数据不存在 J初值为1,所以ji表示i这个位置不合法 时间复杂度:控制结构为while循环,基本操作为指针移动,移动次数与表长有关,考虑最坏情况从头移到尾,所以时间复杂度为表长 * 比顺序表简单:对比(不需要移动元素) 插入位置也是第i个位置的前一个位置有序对ai-1,ai改变为ai-1,e和e,ai 而链式存储要从头找到当前位置,要找到ai-1元素 画图演示 只要改变指针域即可,但必须从头找到尾操作,即GetElem(L,i-1)操作 * P在前,s在后,s为插入点,j为计数器 首先查找插入位置的前驱,即GetElem(L,i-1)操作(算法中的while循环) * 画图演示 删除前要找到删除位置的前驱指针 * Ai-1位置为p,删除位置为q,p在前,q在后 while ((p-next) j i-1 ) { p=p-next; ++j; }寻找第i个结点,令P指向其前驱 if( !
文档评论(0)