赞
踩
1、数据结构三要素:逻辑结构、存储结构(物理结构)、数据的运算。
(1)逻辑结构:是指数据元素之间的逻辑关系,即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
(2)存储结构(物理结构):是指数据在计算机中的表示(又称映像),是用计算机语言实现的逻辑结构,它依赖于计算机语言。
(3)数据的运算:包括运算的定义和实现。
2、数据元素:是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如:学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。
3、数据对象:是具有相同性质的数据元素的集合,是数据的一个子集。
4、数据类型:是一个值的集合和定义在此集合上的一组操作的总称。
5、数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
6、算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。一个算法应具有5个特性:
通常,设计一个“好”的算法应考虑达到以下目标:
7、时间复杂度
8、空间复杂度
1、知识框架
2、线性表的定义
n = 0
时线性表是一个空表。3、线性表的特点
4、线性表的基本操作
InitList(&L);
初始化表,构造一个空的线性表;Length(L);
求表长,返回线性表 L 的长度,即 L 中数据元素的个数;LocateElem(L, e);
按值查找操作,在表 L 中查找具有给定关键字值的元素;GetElem(L, i);
按位查找操作,获取表 L 中第 i 个位置的元素的值;ListInsert(&L, i, e);
插入操作,在表 L 中的第 i 个位置上插入指定元素 e;ListDelete(&L, i, &e);
删除操作,删除表 L 中第 i 个位置的元素,并用 e 返回删除元素的值;PrintList(L);
输出操作,按前后顺序输出线性表L的所有元素值;Empty(L);
判空操作,若 L 为空表,则返回true
,否则返回false
;DestroyList(&L);
销毁操作,销毁线性表,并释放线性表 L 所占用的内存空间;5、线性表的顺序表示—顺序表
ElemType
,则线性表的顺序存储类型描述为://数组空间静态分配,可能会产生溢出
#define MaxSize 50//定义线性表的最大长度
typedef struct {
ElemType data[MaxSize];//顺序表的元素数组
int length;//顺序表的当前长度
} SqList;//顺序表的类型定义
//数组空间动态申请
#define InitSize 100//表长度的初始定义
typedef struct {
ElemType *data;//指示动态分配数组的指针
int MaxSize, length;//数组的最大容量和当前个数
} SeqList;//动态分配数组的顺序表的类型定义
动态申请得到的内存是连续的,同样属于顺序存储结构。C的初始动态分配语句为:
SeqList L;
L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
C++的初始动态分配语句为:
L.data = new ElemType[InitSize];
6、顺序表上基本操作的实现
(1)插入操作
1<= i <= L.length + 1
)个位置插入新元素 e 。若 i 的输入不合法,则返回false
,表示插入失败;否则,将第 i 个元素及其后的所有元素依次往后移动一个位置,腾出一个空位置插入新元素 e,顺序表长度增加1,插入成功,返回true
。bool ListInsert(SqList &L, int i, ElemType e) {
if( i < 1 || i > L.length + 1 )//判断i的范围是否有效
return false;
if( L.length >= MaxSize )//当前存储空间已满,不能插入
return false;
for( int j = L.length; j >= i; j -- )//将第i个元素及之后的元素后移
L.data[j] = L.data[j - 1];
L.data[i - 1] = e;//在位置i处放e
L.length ++;//线性表长度加1
return true;
}
i = n + 1
),元素后移语句将不执行,时间复杂度为O(1);i = 1
),元素后移语句将执行 n 次,时间复杂度为O(n);n-i+1
次,所以移动结点的平均次数为 pi * (n-i+1)( i 从1到n+1求和)= n/2
,所以平均时间复杂度为O(n)。(2)删除操作
1 <= i <= L.length
)个位置的元素,用引用变量e
返回。若 i 的输入不合法,则返回false
;否则将被删除元素赋给引用变量e
,并将第 i + 1个元素及其后的所有元素依次往前移动一个位置,返回true
。bool ListDelete(SqList &L, int i, ElemType &e) {
if( i < 1 || i > L.length )//判断i的范围是否有效
return false;
e = L.data[i-1];//将被删除的元素赋值给e
for( int j = i - 1; j < L.length - 1; j ++)//将第i个位置后的元素前移
L.data[j] = L.data[j + 1];
L.length --;//线性表长度减1
return ture;
}
i = n
),无需移动元素,时间复杂度为O(1);i = 1
),需移动除表头元素外的所有元素,时间复杂度为O(n);n-i
个元素,所以移动元素的平均个数为pi * (n - i)( i从1到n求和)= (n - 1)/2
,所以平均时间复杂度为O(n)。可见,顺序表中插入和删除操作的时间主要耗费在移动元素上,而移动元素的个数取决于插入和删除元素的位置。
(3)按值查找(顺序查找)
int LocateElem(SqList L, ElemType e) {
for( int i = 0; i < L.length; i ++ ) {
if( L.data[i] == e )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。