顺序表的存储可分为动态存储和静态存储,动态和静态的区别是存储地址是动态申请还是直接定义的数组,其存储地址都是连续的,C中借助数组来实现。
其主要特性是具有很好的随机访问特性和存储密度高。
其插入,删除和查找的平均时间复杂度均为O(n)。
下面是一个简单的实现,Linux下gcc可以直接编译通过,测试。
#include <stdio.h>
#include <string.h>
#define MAXSIZE 50
//元素类型定义
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
}SeqList;
//向顺序表中插入元素,pos为数组下表的插入位置
int ListInsert(SeqList *L, int pos, ElemType val)
{
if((L->length >= MAXSIZE)||(pos < 0) || (pos >= MAXSIZE))
return -1;
int i;
for(i = L->length; i > pos; i++){
L->data[i] = L->data[i-1];
}
L->data[pos] = val;
L->length++;
return 0;
}
//删除顺序表中下标位置为pos的元素
int ListDelete(SeqList *L, int pos)
{
if((L->length == 0) || (pos > MAXSIZE))
return -1;
int i;
for(i = pos; i < L->length-1; i++){
L->data[i] = L->data[i+1];
}
L->length --;
return 0;
}
//查找顺序表中值为val的元素,返回该元素的下表位置
int ListSearch(SeqList *L, ElemType val)
{
if(L->length == 0)
return -1;
int i;
for(i = 0; i < L->length; i++){
if(L->data[i] == val)
return i;
}
return -1;
}
//测试主函数
int main()
{
int i = 0;
SeqList L;
memset(&L, 0 ,sizeof(L));
while(i < MAXSIZE){
ListInsert(&L, i, i);
i++;
}
ListDelete(&L, 19);
for(i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
printf("13 is at pos: %d\n", ListSearch(&L, 13));
return 0;
}