线性表的顺序存储结构
对于顺序存储结构的线性表我们这里直接称之为线性表,后面一系列关于数据结构的文章中都这样声明。(我们为了后面的方便,才这样声明的)
线性表中的元素类型都是一样的,假设线性表中的每个元素占用c个字节的存储单元。那么线性表中第i + 1个数据元素和第i个数据元素的存储地址的关系是addr(a(i + 1)) = addr(ai ) + c,其中addr表示求得相应位置的地址。则线性表中的第i个数据元素ai的存储地址依据下面的公式可以由a1推算得到:
addr(ai) = addr(a1) + (i - 1)*c
通过这个公式,我们可以计算出线性表中任一元素的地址,这样每个元素的存储时间性能为o(1),我们通常称顺序存储结构的线性表为随机存储结构。
线性表顺序存储的结构代码:
#define MAXSIZE 100
typedef float ElemType
typedef struct
{
ElemType data[MAXSIZE];
int length;//线性表的当前长度
}Slist;
现在介绍下线性表的插入与删除,首先介绍如何在线性表的第i个位置插入新的元素y。
在线性表中插入元素的算法思路如下:
1)插入位置不合理或线性表长度等于数组长度,抛出异常。
2)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
3)将要插入元素填入位置i处。
4)线性表长加1。
下面的代码是如何在线性表的第i个位置插入新的元素y
#define bingo 1
#define error 0
#define MAXSIZE 100
typedef float ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;//线性表的当前长度
}Slist;
int ListInsert(Slist *L,int i,ElemType y)
{
if(L->length==MAXSIZE)return error;
if(i < 1 || i > L->length )return error;
if(i <= L->length)
{
for(int j = L->length;j>=i;j--)
L->data[j] = L->data[j-1];
}
L->data[i - 1] = y;
L->length++;
return bingo;
}
void main()
{
Slist student = {{1,2,3,4,5,6,7,8,8,9},10};//结构体的初始化
Slist *L = &student;
ListInsert(L,11,100);
for(int i = 1;i <= L->length;i++)
{
cout<<L->data[i-1]<<endl;
}
}
在线性表中删除元素的算法思路如下:
1)删除位置不合理,抛出异常。
2)取出删除元素。
3)从删除元素后面第一个位置开始遍历到最后一个元素位置,分别将它们向前移动一个位置。
4)线性表长减1。
下面的代码是如何删除线性表的第i个位置的元素#define bingo 1
#define error 0
#define MAXSIZE 100
typedef float ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;//线性表的当前长度
}Slist;
int ListDelete(Slist *L,int i,ElemType &y)//删除线性表中第i个位置的元素
{
if( L->length == 0 )return error;
if(i < 1 || i > L->length )return error;
y = L->data[i - 1];
if(i < L->length)
{
for(int j = i + 1;j<= L->length;j++)
L->data[j - 2] = L->data[j-1];
}
L->length--;
return bingo;
}
void main()
{
Slist student = {{1,2,3,4,5,100,7,8,8,9},10};//结构体的初始化
Slist *L = &student;
ElemType a ;
ListDelete(L,6,a);
cout<<"a="<<a<<endl;
for(int i = 1;i <= L->length;i++)
{
cout<<L->data[i-1]<<endl;
}
}
线性表的顺序存储结构的优缺点:
优点:1)无需为表示表中元素之间的逻辑关系而增加额外的存储空间。2)可以快速存取表中任意位置的元素。
缺点:1)插入和删除操作都需要移除大量的元素。2)当线性表长度变化较大时,难以确定存储空间的容量。