2顺序表的插入运算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 插入运算的算法设计
插队前:
1
2
3
4
5
6
7
空闲空间
插队后:
1
2
3
4
5
6
7
空闲空间
1 插入运算的算法设计
算法思想:
1)检查 i 值是否超出所允许的范围 (1 i n + 1) ,若超出,则
进行“超出范围”错误处理;
2)将线性表的第 i 个元素和它后面的所有元素均后移一个位置; 3)将新元素写入到空出的第 i 个位置上;
3 插入运算的算法分析
该算法的问题规模是表的长度n,基本语句是for循环中执行元 素后移的语句。 最坏情况:
当i=1时,即新插入的元素为表头结点,需要移动表中所有的 元素,元素后移语句将执行n次,这是最坏的情况,时间复杂度为 O(n); 最好情况:
当i=n+1时,即新插入的结点为表尾结点,元素不需要执行后 移,这是最好的情况,时间复杂度为O(1)。
将新结点x插入L所指的顺序表的 第i个结点的位置上
void InsertList(SeqList *L,DataType x,int i) { int j;
if (L->length==MaxSize { ①表p空rin间tf已("表满空,间不已能满插,入不元能素插,入退元出素,退出运行。");
exit(0); }
i②f (插i<p1入r|i位|nit>置f(L"错-插>误l入en,位g退t置h出+非1运)法行"{); exit(0); }
f③or移(j动=L元->素length-1;j>=i-1;j--) /*从表尾结点至第i个结点依次后移 */ L->data[j+1]=L->data[j];
L④->插d入ata元[i素-1],=x表; 长/*新增元1 素赋值 */ L->length++; /*表长加1 */ }
4)使线性表的长度增 1。 注意几种不同的插入情况
1234567
1 2 3 4 57 65 6
17 21 32 43 54 65 6
1 插入运算的算法设计
下标
0
a1
1
a2


i-2
ai-1
i-1
ai


n-1 an
n …
插入 位置
源自文库
a)插入 前
顺序表中要保持元素同构且无缺项。
2 插入运算的程序设计
《数据结构》 课程 顺序表的插入运算
主讲教师:邹岚
目录 CONTENTS
1 插入运算的算法设计 2 插入运算的程序设计 3 插入运算的算法分析
1 插入运算的算法设计
线性表的插入运算是指在线性表的第i个(1≤i≤n+1) 位置上,插入一个新元素x,使长度为n的线性表 (a1,a2, …, ai,…,an)变成长度为n+1的线性表 (a1,a2, …, ai-1, x, ai,…,an)。
3 插入运算的算法分析
平均情况:
表长为n的线性表中,在第i个位置插入一个新元素,元素后移
语句的执行次数为n-i+1。假设i是一个随机值,即在多次插入运算
中取值分布是均匀的,则概率 pi为 1 ,需要移动的元素平均次数
为: n1
pi(n i 1) =
i 1
1 n 1
n 1
n1
2 插入运算的程序设计
例如:InsertList (&L, 66, 5) for (j=L->length-1; j >= i-1; j--)
L->data[j+1]=L->data[j];
ji j j j
21 18 30 75 42 56 87
L->length-1
0
21 18 30 75 66 42 56 87
(n i 1) =
i 1
n 2
也就是说,在顺序表上实现插入操作,等概率情况下,平均要 移动表中一半的数据元素,算法的平均时间复杂度为O(n)。
谢谢学习
主讲教师:邹岚
相关文档
最新文档