数据结构线性表(顺序表)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
算法的时间复杂度为: O( L.length )
顺序表---- 基本算法
(7)插入
在顺序表中插入指定的数据元素, 插入成功,表长增1。
线性表操作 ListInsert(&L, i, e)的实现:
首先分析:
插入元素时, 线性表的逻辑结构发生什么变化?
(a1, …, ai-1, ai, …, an) 改变为 (a1, …, ai-1, e, ai, …, an)
而遍历算法、查找表中元素的存在、插入、删除 等操作,时间复杂度均为O(n)。
顺序表---- 基本算法
(1)初始化
空表
L.length=0;
时间复杂为:O(1)
顺序表---- 基本算法
(2)判空
if(L.length==0) return OK;
else return ERROR;
时间复杂为:O(1)
第二章 线性表
——顺序表
线性结构四大特点
第一个元素无直接前驱 最后一个元素无直接后继 除第一个元素外,其他每个数据元素 都有唯一一个直接前驱
除最后一个元素外,其他每个数据元 素都有唯一一个直接后面
线性表
定义 最基本、最常用的线性结构。若n(n≥0)个
数据特性相同的数据元素组成的有限序列。
记法
(a1,a2,…,ai-1,ai,ai+1,…,an)
在顺序表中删除指定位置的数据 元素,删除成功,表长减1。
线性表操作 ListDelete(&L, i, &e)的实现:
首先分析:
删除元素时, 线性表的逻辑结构发生什么变化?
(a1, …, ai-1, ai, ai+1, …, an) 改变为 (a1, …, ai-1, ai+1, …, an)
<ai-1, ai>, <ai, ai+1>
特点
1.同一线性表中的数据元素必须具有相同特性 2.具有线性结构的四大特性 3.数据元素之间存在序偶关系
结构 逻辑结构(1对1)、物理结构(顺序存储和链式存储)
基本术语
空表、表长 直接前驱、直接后继 位序
线性表的抽象数据类型
数据对象 数据关系
线性表中的数据元素具有相同特性 相邻数据元素之间存在序偶关系
操作集
线性表的基本操作声明
初始化、销毁、查找、插入、删除、求前驱(后继)、遍历
仅是模型定义,不涉及模型实现,参数不必考虑具 体数据类型,实际应用中,具体问题具体分析。
顺Βιβλιοθήκη Baidu表
定义 用一组地址连续的存储单元依次存放线性表中的数 据元素。采用这种存储结构的线性表叫做顺序表。
a1 a2 … ai-1 ai … an
<ai-1, ai>
<ai-1, e>, <e, ai>
a1 a2 … ai-1 ai … an
a1 a2 … ai-1 e ai … an
表的长度增加
分析:
① 必备条件:表存在且不满 ② i值的合法性检查:1~L.length+1 ③ 将第i个到最后1个元素依次后移一个位置; ④ 在i个位置插入元素; ⑤ 表长增加1 。
基地址
特点 C描述
1.数据元素在“逻辑关系上的相邻”用“物理地址相邻”来 表示。 2.顺序表中任一元素都可“随机存取”。
基本形态
基本操作实现
顺序表的C描述
#define MAXSIZE 100 // 线性表存储空间的分配量,即数组长度
typedef struct {
ElemType elem[MAXSIZE];
}else{ return ERROR;
} }
算法的时间复杂度为:O( L.length )
插入算法时间复杂度分析: 考虑移动元素的平均情况
插入位置
需要移动的结点次数
1
n
平均次数:
2
n-1
(1+2+…+n-1+n)/(n+1)
…
…
=n/2
n
1
T(n)=O(n)
n+1
0
顺序表---- 基本算法
(8)删除
例如:ListInsert_Sq(L, 5, 66)
21 18 30 75 42 56 87
0
L.length-1
21 18 30 75 66 42 56 87
Status ListInsert ( SqList &L, int i, ElemType e) {
if ( i>=1&&i<=L.length+1 ){ for ( j=L.length; j>=i; j-- ) //元素后移 L.elem[j] = L.elem[j-1]; L.elem[i-1] = e; // 插入e L.length++; // 表长增1 return OK; // 插入成功
}
时间复杂为:O(1)
顺序表---- 基本算法
(5)遍历
for ( i=1; i<=L.length; i++ ) visit( L.elem[i-1] );
时间复杂为:O(L.length)
顺序表---- 基本算法
(6)查找 搜索顺序表中是否存在指定 的数据元素。存在,查找成 功;否则,查找失败。
<ai-1, ai+1>
a1 a2 … ai-1 ai ai+1 … an
a1 a2 … ai-1 ai+1 … an
例如:顺序表
L.elem[0]
23 75 41 38 54 62 17
i 12348
e = 38 50
L.length-1
可见,基本操作是: 将顺序表中的元素 逐个和给定值 e 相比较。
int LocateElem(SqList L,Elemtype e){ for(i=1 ;i<=L.length;i++){ if(e==L.elem[i-1]){ return i; } } return 0;
顺序表---- 基本算法
(3)求表长
return L.length;
时间复杂为:O(1)
顺序表---- 基本算法
(4)取元素(取第i个元素
e)
i合法
e=L.elem[i-1];
if(i>=1&&i<=L.length){ e=L.elem[i-1]; return OK;
}else { return ERROR;
int length; // 当前长度
} SqList; // 俗称 顺序表
顺序表的基本形态
顺序表空:条件 L.length==0
不允许删除操作
顺序表满:
条件 L.length==MAXSIZE 不允许插入操作
不空也不满:
可以插入,删除操作
顺序表---- 基本算法
根据顺序表的实现形式,表长length是类型定义 的属性,可以实现求表长、初始化、取值、判空 等操作,时间复杂度均为O(1)。
算法的时间复杂度为: O( L.length )
顺序表---- 基本算法
(7)插入
在顺序表中插入指定的数据元素, 插入成功,表长增1。
线性表操作 ListInsert(&L, i, e)的实现:
首先分析:
插入元素时, 线性表的逻辑结构发生什么变化?
(a1, …, ai-1, ai, …, an) 改变为 (a1, …, ai-1, e, ai, …, an)
而遍历算法、查找表中元素的存在、插入、删除 等操作,时间复杂度均为O(n)。
顺序表---- 基本算法
(1)初始化
空表
L.length=0;
时间复杂为:O(1)
顺序表---- 基本算法
(2)判空
if(L.length==0) return OK;
else return ERROR;
时间复杂为:O(1)
第二章 线性表
——顺序表
线性结构四大特点
第一个元素无直接前驱 最后一个元素无直接后继 除第一个元素外,其他每个数据元素 都有唯一一个直接前驱
除最后一个元素外,其他每个数据元 素都有唯一一个直接后面
线性表
定义 最基本、最常用的线性结构。若n(n≥0)个
数据特性相同的数据元素组成的有限序列。
记法
(a1,a2,…,ai-1,ai,ai+1,…,an)
在顺序表中删除指定位置的数据 元素,删除成功,表长减1。
线性表操作 ListDelete(&L, i, &e)的实现:
首先分析:
删除元素时, 线性表的逻辑结构发生什么变化?
(a1, …, ai-1, ai, ai+1, …, an) 改变为 (a1, …, ai-1, ai+1, …, an)
<ai-1, ai>, <ai, ai+1>
特点
1.同一线性表中的数据元素必须具有相同特性 2.具有线性结构的四大特性 3.数据元素之间存在序偶关系
结构 逻辑结构(1对1)、物理结构(顺序存储和链式存储)
基本术语
空表、表长 直接前驱、直接后继 位序
线性表的抽象数据类型
数据对象 数据关系
线性表中的数据元素具有相同特性 相邻数据元素之间存在序偶关系
操作集
线性表的基本操作声明
初始化、销毁、查找、插入、删除、求前驱(后继)、遍历
仅是模型定义,不涉及模型实现,参数不必考虑具 体数据类型,实际应用中,具体问题具体分析。
顺Βιβλιοθήκη Baidu表
定义 用一组地址连续的存储单元依次存放线性表中的数 据元素。采用这种存储结构的线性表叫做顺序表。
a1 a2 … ai-1 ai … an
<ai-1, ai>
<ai-1, e>, <e, ai>
a1 a2 … ai-1 ai … an
a1 a2 … ai-1 e ai … an
表的长度增加
分析:
① 必备条件:表存在且不满 ② i值的合法性检查:1~L.length+1 ③ 将第i个到最后1个元素依次后移一个位置; ④ 在i个位置插入元素; ⑤ 表长增加1 。
基地址
特点 C描述
1.数据元素在“逻辑关系上的相邻”用“物理地址相邻”来 表示。 2.顺序表中任一元素都可“随机存取”。
基本形态
基本操作实现
顺序表的C描述
#define MAXSIZE 100 // 线性表存储空间的分配量,即数组长度
typedef struct {
ElemType elem[MAXSIZE];
}else{ return ERROR;
} }
算法的时间复杂度为:O( L.length )
插入算法时间复杂度分析: 考虑移动元素的平均情况
插入位置
需要移动的结点次数
1
n
平均次数:
2
n-1
(1+2+…+n-1+n)/(n+1)
…
…
=n/2
n
1
T(n)=O(n)
n+1
0
顺序表---- 基本算法
(8)删除
例如:ListInsert_Sq(L, 5, 66)
21 18 30 75 42 56 87
0
L.length-1
21 18 30 75 66 42 56 87
Status ListInsert ( SqList &L, int i, ElemType e) {
if ( i>=1&&i<=L.length+1 ){ for ( j=L.length; j>=i; j-- ) //元素后移 L.elem[j] = L.elem[j-1]; L.elem[i-1] = e; // 插入e L.length++; // 表长增1 return OK; // 插入成功
}
时间复杂为:O(1)
顺序表---- 基本算法
(5)遍历
for ( i=1; i<=L.length; i++ ) visit( L.elem[i-1] );
时间复杂为:O(L.length)
顺序表---- 基本算法
(6)查找 搜索顺序表中是否存在指定 的数据元素。存在,查找成 功;否则,查找失败。
<ai-1, ai+1>
a1 a2 … ai-1 ai ai+1 … an
a1 a2 … ai-1 ai+1 … an
例如:顺序表
L.elem[0]
23 75 41 38 54 62 17
i 12348
e = 38 50
L.length-1
可见,基本操作是: 将顺序表中的元素 逐个和给定值 e 相比较。
int LocateElem(SqList L,Elemtype e){ for(i=1 ;i<=L.length;i++){ if(e==L.elem[i-1]){ return i; } } return 0;
顺序表---- 基本算法
(3)求表长
return L.length;
时间复杂为:O(1)
顺序表---- 基本算法
(4)取元素(取第i个元素
e)
i合法
e=L.elem[i-1];
if(i>=1&&i<=L.length){ e=L.elem[i-1]; return OK;
}else { return ERROR;
int length; // 当前长度
} SqList; // 俗称 顺序表
顺序表的基本形态
顺序表空:条件 L.length==0
不允许删除操作
顺序表满:
条件 L.length==MAXSIZE 不允许插入操作
不空也不满:
可以插入,删除操作
顺序表---- 基本算法
根据顺序表的实现形式,表长length是类型定义 的属性,可以实现求表长、初始化、取值、判空 等操作,时间复杂度均为O(1)。