线性表
零个或多个数据元素的有限序列。
线性表的顺序存储结构
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
C语言描述线性表的顺序存储结构
/**
* 描述顺序存储结构需要三个属性:
* 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
* 线性表的最大存储容量:数组长度MaxSize
* 线性表的当前长度: length
*/
#define MAXSIZE 20 /*存储空间初始分配量*/
typedef int ElemType; /*ElemType类型根据实际情况而定,这里假设为int*/
typedef struct {
ElemType data[MAXSIZE]; /*数组存储数据元素,最大值为MAXSIZE*/
int length; /*线性表当前长度*/
}SqList;
数据长度与线性表长度区别
在任何时刻,线性表的长度应该小于等于数组的长度。
顺序存储结构的代码实现
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /*存储空间初始分配量*/
typedef int ElemType; /*ElemType类型根据实际情况而定,这里假设为int*/
typedef struct {
ElemType data[MAXSIZE]; /*数组存储数据元素,最大值为MAXSIZE*/
int length; /*线性表当前长度*/
}SqList;
typedef int Status;
/**
* 获得元素操作
* Status是函数的原型,其值是函数结果状态代码,如OK等
* 初始条件:顺序线性表L已存在
* 操作结果:用e返回L中第i个数据元素的值
*/
Status 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;
}
/**
* 插入操作
*/
Status ListInsert(SqList *L, int i, ElemType e)
{
int k;
//线性表已满
if (L->length == MAXSIZE) {
return ERROR;
}
//i不在范围中
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;
}
/**
* 删除操作
*/
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;k++)
{
L->data[k-1] == L->data[k];
}
}
L->length--;
return OK;
}
int main(void)
{
SqList list = { {1,2,3,4}, 4 };
int key = 3;
ElemType result;
/*测试GetElem*/
GetElem(list,key, &result);
printf("获得元素操作结果%d\n", result);
/*测试ListInsert*/
ElemType value = 123;
ListInsert(&list,key,value);
printf("获得元素操作结果%d\n", list.data[--key]);
/*测试ListDelete*/
ListDelete(&list,key,&result);
}
线性表顺序存储结构的优缺点
优点
- 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速地存取表中任意位置的元素
缺点
- 插入和删除操作需要移动大量元素
- 当线性表长度变化较大时,难以确定存储空间的容量
- 造成存储空间的“碎片”