线性表的顺序存储结构
Posted 紫洁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表的顺序存储结构相关的知识,希望对你有一定的参考价值。
1 线性表的顺序存储结构,是指用一段地址连续的存储单元依次存储线性表的数据元素。既然线性表的每个数据元素类型都相同,所以可以用一维数组来实现顺序存储结构,即把第一个元素存储在下标为0的位置上,接着把线性表相邻的元素存储在数组中相邻的位置。
2 线性表顺序存储的结构代码
#define MAXSIZE 20 //存储空间初始分配量
typedef int ElemType; //ElemType表示类型,这里假设为int
typedef struct {
ElemType data[MAXSIZE]; //数组存储数据元素,最大值为MAXSIZE
int length; //线性表当前长度
} SqList;
说明:描述顺序存储结构需要三个属性
(1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
(2)线性表的最大存储容量:数组长度MAXSIZE
(3)线性表的当前长度:length
3 顺序存储结构的插入和删除
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
(1)用e返回数组L中第i个数据元素的值
Status getElem(SqList L, int i, ElemType *e) {
if (L.length < 0 || i < 0 || i > L.length) {
return ERROR;
}
*e = L.data[i - 1];
return OK;
}
时间复杂度为O(1).
(2)在线性表第i个位置插入元素e
/* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length + 1 */
/* 操作结果:在L中第i个位置之前插入e,L的长度加1 */
Status ListInsert(SqList *L, int i, ElemType e) {
int k;
if (L->length == MAXSIZE) { //线性表已满
return ERROR;
}
if (i < 1 || i > L->length + 1) { //插入的位置不在范围内
return ERROR;
}
if (i <= L-> length) { //不是插入在队尾
for (k = L-> length - 1; k >= i; i --) {
L->data[k + 1] = L->data[k];
}
}
L->data[i - 1] = e;
L->length ++;
return OK;
}
(3) 删除第i个位置的元素,并用e返回其值
/* 初始条件:顺序线性表L已存在,i的取值范围为1 <= i <= L->length */
/* 操作结果:删除L中第i个数据元素,L的长度减1 */
Status ListDelete(SqList *L, int i, ElemType *e) {
int k;
if (L->length == 0) {
return ERROR;
}
if (i < 1 || i > L-> length) {
return ERROR;
}
*e = L->data[i - 1];
if (i < L->length) { //不是删除队尾元素
for (k = i; k <= L->length - 1; i++) {
L->data[k-1] = L->data[k];
}
}
L->length --;
return OK;
}
(4)时间复杂度
如果插入到最后一个位置,或者删除最后一个元素,时间复杂度为O(1)。最坏情况,即插入到第一个位置、或者删除第一个元素,此时时间复杂度为O(n).平均时间为(n-1)/2.故时间复杂度为O(n).
以上是关于线性表的顺序存储结构的主要内容,如果未能解决你的问题,请参考以下文章