线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
下面给出关于线性表顺序存储常用操作的代码:
#include <stdio.h>
#define MAXSIZE 20 //存储空间初始分配量
#define true 1
#define false 0
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE]; //数组存储数据元素,最大值为MAXSIZE
int length; //线性表当前长度
}SqList;
void InitList(SqList *L) //初始化顺序表
{
int i;
for(i = 0;i<MAXSIZE;i++)
L->data[i] = 0;
L->length = 0;
}
int ListEmpty(SqList L) //判断表是否为空
{
if(L.length == 0)
return true;
return false;
}
void ClearList(SqList *L) //将线性表清空
{
int i;
for(i = 0;i < L->length;i++)
L->data[i] = 0;
L->length = 0;
}
void GetElem(SqList L,int i,ElemType *e) //将线性表L中第i个元素值返回给e
{
*e = L.data[i];
}
int LocateElem(SqList L,ElemType e) //在线性表中查找与e相等的值,成功返回值的下标,没找到返回false
{
int i;
for(i = 0;i < L.length;i++)
{
if(L.data[i] == e)
return i;
}
return false;
}
int ListInsert(SqList *L,int i,ElemType e) //在线性表 i 处插入元素e
{
if( L->length == MAXSIZE)
{
printf("内存已满,无法插入\n");
return 0;
}
else if(i > L->length || i < 0)
{
printf("下标不在数组范围内\n");
return false;
}
int t;
for(t = L->length-1;t >= i;t--)
L->data[t + 1] = L->data[t];
L->data[i] = e;
L->length++;
}
int ListDelete(SqList *L,int i,ElemType *e) //删除线性表L中第i个元素,并用e返回其值
{
if(ListEmpty(*L))
{
printf("此线性表为空,不能删除\n");
return false;
}
else if(i > L->length || i < 0)
{
printf("下标不在数组范围内\n");
return false;
}
*e = L->data[i];
int t;
for(t = i;t < L->length;t++)
L->data[i] = L->data[i + 1];
L->length--;
}
int ListLength(SqList L) //返回线性表的长度
{
return L.length;
}
void print(SqList L) //打印线性表
{
int i;
for(i = 0;i <L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
int main() //测试程序
{
SqList L;
InitList(&L);
int i;
for(i = 0;i <10;i++)
ListInsert(&L,i,i);
print(L);
ElemType e;
ListDelete(&L,2,&e);
print(L);
printf("%d\n",e);
return 0;
}
线性表线性存储结构的优缺点:
优点:无须为表示表中元素中间的逻辑关系而增加额外的存储空间
可以快速的存取biao表中任意位置的元素
缺点:插入和删除操作需要移动大量元素
当线性表长度变化较大时,难以确定存储空间的容量
造成存储空间的“碎片”