码迷,mamicode.com
首页 > 其他好文 > 详细

线性表的顺序存储结构

时间:2016-06-25 23:08:41      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

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).

 

线性表的顺序存储结构

标签:

原文地址:http://www.cnblogs.com/muzijie/p/5617051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!