知识大全 顺序表上实现的基本运算
Posted 结点
篇首语:犀渠玉剑良家子,白马金羁侠少年。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 顺序表上实现的基本运算相关的知识,希望对你有一定的参考价值。
顺序表上实现的基本运算
表的初始化 void InitList(SeqList *L) \\\\顺序表的初始化即将表的长度置为 L >length=
求表长 int ListLength(SeqList *L) \\\\求表长只需返回L >length return L >length;
取表中第i个结点 DataType GetNode(L i) \\\\取表中第i个结点只需返回和L >data[i ]即可 if (i< ||i> L >length ) Error( position error ) return L >data[i ]
查找值为x的结点 【参见参考书】
插入( ) 插入运算的逻辑描述 线性表的插入运算是指在表的第i( ≤i≤n+ )个位置上 插入一个新结点x 使长度为n的线性表 (a … ai ai …an)变成长度为n+ 的线性表
(a … ai x ai …an) 注意 ① 由于向量空间大小在声明时确定 当L >length≥ListSize时 表空间已满 不可再做插入操作 ② 当插入位置i的值为i>n或i< 时为非法位置 不可做正常插入操作
( ) 顺序表插入操作过程 在顺序表中 结点的物理顺序必须和结点的逻辑顺序保持一致 因此必须将表中位置为n n … i上的结点 依次后移到位置n+ n … i+ 上 空出第i个位置 然后在该位置上插入新结点x 仅当插入位置i=n+ 时 才无须移动结点 直接将x插入表的末尾 具体过程见【动画演示】
( )具体算法描述 void InsertList(SeqList *L DataType x int i) //将新结点 x插入L所指的顺序表的第i个结点ai的位置上 int j; if (i< ||i>L >length+ ) Error( position error );//非法位置 退出运行 if (L >length>=ListSize) Error( overflow ); //表空间溢出 退出运行 for(j=L >length ;j>=i ;j ) L >data[j+ ]=L >data[j];//结点后移 L >data[i ]=x; //插入x L >Length++; //表长加
( )算法分析① 问题的规模 表的长度L >length(设值为n)是问题的规模 ② 移动结点的次数由表长n和插入位置i决定 算法的时间主要花费在for循环中的结点后移语句上 该语句的执行次数是n i+ 当i=n+ 移动结点次数为 即算法在最好时间复杂度是 ( ) 当i= 移动结点次数为n 即算法在最坏情况下时间复杂度是 (n)③ 移动结点的平均次数Eis(n) 其中 在表中第i个位置插入一个结点的移动次数为n i+ pi表示在表中第i个位置上插入一个结点的概率 不失一般性 假设在表中任何合法位置( ≤i≤n+ )上的插入结点的机会是均等的 则 p =p =…=pn+ = /(n+ ) 因此 在等概率插入的情况下
即在顺序表上进行插入运算 平均要移动一半结点
. 删除( )删除运算的逻辑描述 线性表的删除运算是指将表的第i( ≤i≤n)个结点删去 使长度为n的线性表 (a … ai ai ai+ … an) 变成长度为n 的线性表 (a … ai ai+ … an)注意 当要删除元素的位置i不在表长范围(即i< 或i>L >length)时 为非法位置 不能做正常的删除操作
( )顺序表删除操作过程 在顺序表上实现删除运算必须移动结点 才能反映出结点间的逻辑关系的变化 若i=n 则只要简单地删除终端结点 无须移动结点 若 ≤i≤n 则必须将表中位置i+ i+ … n的结点 依次前移到位置i i+ … n 上 以填补删除操作造成的空缺 其删除过程【参见动画演示】
( )具体算法描述 void DeleteList(SeqList *L int i) //从L所指的顺序表中删除第i个结点ai int j; if(i< ||i>L >length) Error( position error ); //非法位置 for(j=i;j<=L >length ;j++) L >data[j ]=L >data[j]; //结点前移 L >length ; //表长减小
( )算法分析 ①结点的移动次数由表长n和位置i决定 i=n时 结点的移动次数为 即为 ( ) i= 时 结点的移动次数为n 算法时间复杂度分别是 (n) ②移动结点的平均次数EDE(n)
其中 删除表中第i个位置结点的移动次数为n i pi表示删除表中第i个位置上结点的概率 不失一般性 假设在表中任何合法位置( ≤i≤n)上的删除结点的机会是均等的 则 p =p =…=pn= /n因此 在等概率插入的情况下
顺序表上做删除运算 平均要移动表中约一半的结点 平均时间复杂度也是 (n)
cha138/Article/program/sjjg/201311/23962相关参考
例如图表示在一个顺序表中删除一个元素的前后变化过程原表长为删除第个元素E在删除后为了满足顺序表的先后关系必须将第个到第个元素(下标位~)前移移一位 > 图顺序表的删除操作示意图 在顺序表上完
顺序表插入运算的操作步骤如下 ()检查待插入的表是否存在若不存在退出; ()判断顺序表是否满(即表长length是否大于等于MAXSIZE)?若满退出;否则执行(); ()检查插入位置的合法
求顺序表的长度 求顺序表的长度是在顺序表存在的情况下顺序表中元素的个数首先判断顺序表是否存在若存在返回length若不存在返回具体算法描述如下 intLength_SeqList(PSeqLi
顺序表的销毁 顺序表使用完后必须要销毁否则可能会造成内存资源浪费等问题顺序表的销毁操作实际上是初始化操作的逆运算由于要修改顺序表的指针变量所以要将指针地址传给该函数首先判断要销毁的表是否存在然后
具体算法描述如下 intDelete_SeqList(PSeqListSeqListPointinti) /*顺序表删除入口参数顺序表指针删除元素位置 返回标志表示成功表示删除位置不合法表示
/*顺序表检索入口参数为顺序表指针检索元素 返回元素位置表示表不存在表示查找失败*/ inti=; if(!SeqListPoint) printf(表不存在); return();
顺序表的初始化 顺序表的初始化即构造一个空表要返回该线性表所以将返回一个指向顺序表的指针首先动态分配存储空间然后将表中length置为表示表中没有数据元素具体算法描述如下 PSeqListIn
return();/*表不存在不能插入*/ if(SeqListPoint>length>=MAXSIZE) printf(表溢出); return();/*表空间已满不
算法 顺序表的插入运算时间主要消耗在了数据的移动上在第i个位置上插入x从ei到en都要向下移动一个位置共需要移动ni+个元素设在第i个位置上作插入的概率为Pi则平均移动数据元素的次数 > 由
顺序表应用举例 【例】有一线性表的顺序表示(aa…an)设计一算法将该线性表逆置成逆线性表(anan…a)要求用最少的辅助空间 解题思路可考虑将a与an交换a与an交换……ai与ani+交换其