您的位置:首页 > 其它

学习 线性表的顺序存储 总结一

2015-09-10 22:21 381 查看

学习 线性表的顺序存储 总结一

线性表是最简单的一种数据结构了,也是最常用的一种。线性表的逻辑结构简单,便于实现和操作。线性表有以下两个特点:

1. 它首先是个序列,元素之前是有顺序的。

2. 数据元素之间的关系是一对一的,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

线性表的元素个数n定义为线性表的长度。

线性表的顺序存储定义

线性表的顺序存储:用一段地址连续的存储单元依次存储线性表的数据元素。线性表的顺序存储结构代码如下:

#define MAXSIZE 20
typedef int ElemType
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;


由以上定义,可以发现线性表的顺序存储有下面三个属性:

1. 存储空间的起始位置—数组data

2. 线性表顺序存储的最大存储容量

3. 线性表顺序存储的当前长度length

下面把线性表的顺序存储记为顺序表。并学习顺序表的一些基本操作:顺序表的初始化、建立、查找、插入、删除等。

// 顺序表的初始化
SqList Init()
{
SqList L;

L.length = 0;

return L;
}


// 顺序表的建立
SqList Create(SqList L)
{
int i;
srand((unsigned)time(NULL);

for (i = 0; i < 100; i++)
{
L.data[i] = rand() % 100;
L.length++;
}

return L;
}


// 顺序表的查找
int GetElem(SqList L, int i, ElemType* e)
{
if (L.length == 0 || i < 1 || i > L.length)
{
return ERROR;
}

*e = L.data[i - 1];

return OK;
}


// 顺序表的插入
int 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 - 1; k--)
{
L->data[k + 1] = L->data[k];
}
}

L->data[i - 1] = e;
L->length++;

return OK;
}


// 顺序表的删除
int ListInsert(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; k++)
{
L->data[k - 1] = L->data[k];
}
}

L->length--;

return OK;
}


顺序表的插入或删除操作,时间复杂度都是O(n). 而存和读数据操作,不管是哪个位置,时间复杂度为O(1).

下面总结下顺序表的优缺点:

好吧,从优点开始说。当我们在使用线性表的时候,我们不需要为表中元素之间的逻辑关系而增加额外的存储空间,而且可以快速的存取表中任意位置的元素。接下来谈谈缺点。如我们所见,如果我们要插入或者删除的元素是在第一个位置,那么无疑的,我们需要移动大量的元素来完成这样的操作,而且限于线性表长度必须小于数组长度,如果我们需要插入大量数据,那么很难保证空间是否充足,而如果我们要删除大量数据的时候,无疑又会造成空间的浪费。

参考文档:

《数据结构》

/article/1307886.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: