知识大全 线性表 - 顺序存储结构 - 顺序表上的基本运算
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 … a i a i …a n )
变成长度为n+ 的线性表
(a … a i x a i …a n )
注意
① 由于向量空间大小在声明时确定 当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个结点a i 的位置上
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)
③ 移动结点的平均次数E is (n)
>
其中
在表中第i个位置插入一个结点的移动次数为n i+
p i 表示在表中第i个位置上插入一个结点的概率 不失一般性 假设在表中任何合法位置( ≤i≤n+ )上的插入结点的机会是均等的 则
p =p =…=p n+ = /(n+ )
因此 在等概率插入的情况下
>
即在顺序表上进行插入运算 平均要移动一半结点
删除
( )删除运算的逻辑描述
线性表的删除运算是指将表的第i( ≤i≤n)个结点删去 使长度为n的线性表
(a … a i a i a i+ … a n )
变成长度为n 的线性表
(a … a i a i+ … a n )
注意
当要删除元素的位置i不在表长范围(即i< 或i>L >length)时 为非法位置 不能做正常的删除操作
( )顺序表删除操作过程
在顺序表上实现删除运算必须移动结点 才能反映出结点间的逻辑关系的变化 若i=n 则只要简单地删除终端结点 无须移动结点;若
≤i≤n 则必须将表中位置i+ i+ … n的结点 依次前移到位置i i+ … n 上 以填补删除操作造成的空缺 其删除过程【 参见
动画演示 】
( )具体算法描述
void DeleteList(SeqList *L int i)
//从L所指的顺序表中删除第i个结点a i
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)
②移动结点的平均次数E DE (n)
>
其中
删除表中第i个位置结点的移动次数为n i
p i 表示删除表中第i个位置上结点的概率 不失一般性 假设在表中任何合法位置( ≤i≤n)上的删除结点的机会是均等的 则
p =p =…=p n = /n
因此 在等概率插入的情况下
顺序表上做删除运算 平均要移动表中约一半的结点 平均时间复杂度也是 (n)
cha138/Article/program/sjjg/201311/23334相关参考
顺序表应用举例 【例】有一线性表的顺序表示(aa…an)设计一算法将该线性表逆置成逆线性表(anan…a)要求用最少的辅助空间 解题思路可考虑将a与an交换a与an交换……ai与ani+交换其
本算法中时间主要消耗在for循环上的元素与元素之间的交换该循环的循环次数为n/次所以其时间复杂度为O(n) 【例】有顺序表A和B其元素均按从小到大的升序排列编写一个算法将它们合并成一个顺序表C要
顺序表的删除 线性表的删除运算是指将表的第i(≤i≤n)个位置上的结点删除使长度为n的线性表(a…aiai…an)变成长度为n的线性表(a…aiai+…an) 删除操作分为相应两个阶段只是顺序与前
求顺序表的长度 求顺序表的长度是在顺序表存在的情况下顺序表中元素的个数首先判断顺序表是否存在若存在返回length若不存在返回具体算法描述如下 intLength_SeqList(PSeqLi
在程序设计语言中一维数组在内存中占用的存储空间就是一组连续的存储区域因此用一维数组来表示顺序表的数据存储区域是再合适不过的考虑到线性表的运算有插入删除等运算(即表长是不断变化的)因此数组的容量需足
例如图表示在一个顺序表中删除一个元素的前后变化过程原表长为删除第个元素E在删除后为了满足顺序表的先后关系必须将第个到第个元素(下标位~)前移移一位 > 图顺序表的删除操作示意图 在顺序表上完
顺序表的销毁 顺序表使用完后必须要销毁否则可能会造成内存资源浪费等问题顺序表的销毁操作实际上是初始化操作的逆运算由于要修改顺序表的指针变量所以要将指针地址传给该函数首先判断要销毁的表是否存在然后
顺序表插入运算的操作步骤如下 ()检查待插入的表是否存在若不存在退出; ()判断顺序表是否满(即表长length是否大于等于MAXSIZE)?若满退出;否则执行(); ()检查插入位置的合法
/*顺序表检索入口参数为顺序表指针检索元素 返回元素位置表示表不存在表示查找失败*/ inti=; if(!SeqListPoint) printf(表不存在); return();
具体算法描述如下 intDelete_SeqList(PSeqListSeqListPointinti) /*顺序表删除入口参数顺序表指针删除元素位置 返回标志表示成功表示删除位置不合法表示