線性表的順序存儲結構,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。
下面給出關於線性表順序存儲常用操作的代碼:
#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表中任意位置的元素
缺點:插入和刪除操作需要移動大量元素
當線性表長度變化較大時,難以確定存儲空間的容量
造成存儲空間的“碎片”