顺序表的特征
- 线性结构: 顺序表是一种线性结构,其中元素之间存在顺序关系,每个元素都有唯一的前驱和后继元素,除了第一个和最后一个元素外。
- 连续存储: 顺序表的元素在内存中是连续存储的,这使得通过下标或指针可以直接访问任何元素。
- 固定大小: 顺序表在创建时通常需要指定固定的大小,这个大小一般是预先分配的数组大小。
顺序表的主要操作
- 插入操作: 在顺序表中插入元素通常需要移动其他元素,以保持元素的顺序。这可能涉及到大量数据的搬移,因此插入操作的效率可能取决于插入位置和表的大小。
- 删除操作: 删除元素同样需要移动其他元素,以填补被删除元素的空间。
- 查找操作: 可以通过下标直接访问顺序表中的元素,因此查找操作是非常高效的。
- 动态扩展: 当顺序表满了而需要插入新元素时,可能需要重新分配更大的数组,并将原有元素复制到新数组中。这样的过程涉及到一定的时间复杂度,但可以通过合理设计动态扩展的策略来减少频繁的扩展操作。
代码实现如下
#include<stdio.h>
#include<stdlib.h>
#define MaxSize1 10
#define InitSize 10
//静态顺序表
typedef struct {
int data[MaxSize1];
int length;
} SqlList1;
//动态顺序表
typedef struct {
int *data;
int length;
int MaxSize;
} SqlList2;
//初始化静态顺序表
void InitList1(SqlList1 &L){
for(int i=0;i<MaxSize1;i++)
L.data[i]=0;
L.length=0;
}
//初始化动态顺序表
void InitList2(SqlList2 &L){
//使用malloc函数分配内存空间
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize=InitSize;
}
//增加动态顺序表的长度
void InceateSize(SqlList2 &L,int len){
int *p=L.data;
L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));
L.MaxSize=L.MaxSize+len;//最大长度增加
for(int i=0;i<L.length;i++){
L.data[i]=p[i];
}
free(p);
}
//静态顺序表的插入
bool ListInsert(SqlList1 &L,int i,int e){
//判断i是否越界
if(i>L.length+1||i<1)
return false;
//判断是否存满
if(L.length>=Maxsize1)
return false;
for(int j=L.length-1;j>i;j--){
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;
L.length++;
return true;
}
//静态顺序表的删除
bool ListDelete(SqlList1 &L,int i,int &e){
//判断i是否合法
if(i>L.length+1||i<1)
return false;
//判断是否为空表
if(L.length=0)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}
L.length--;
return true;
}
//按位查找
int GetElem(SqlList1 &L,int i){
return L.data[i-1];
}
//按值查询
int LocateElem(SqlList1 &L,int i){
for(int j=0;j<L.length;j++){
if(L.data[j]==i)
return j+1;
}
return 0;
}
int main (){
SqlList1 L;
InitList1(L);
}