顺序表基本操作
顺序表特点:在逻辑上是连续的,在物理空间上也是连续的;在顺序表中存储数据元素,必须从空间的首位置开始存储,连续存放,不能有空的空间。
结构的声明:
typedef int Datatype
typedef struct SqList
{
Datatype* data//指向存储空间的指针
int length//存储的元素个数
int size//空间的大小
}SqList;
方法的声明
bool InitSqList(SqList *sq,int init_size)//初始化
bool InsertOfPos(SqList *sq,Datatype value,int pos)//在指定的位置插入
bool InsertOfFront(SqList *sq,Datatype value)//最前面插入
bool InsertOfRear(SqList *sq,Datatype value)//最后面插入
bool DeleteOfPos(SqList *sq,int pos)//指定位置删除
bool DeleteOfFront(SqList *sq)//最前面删除
bool DeleteOfRear(SqList *sq)//最后面删除
bool IsEmptySqlist(SqList *sq)//判空
bool DestroySqList(SqList *sq)//销毁
int LengthSqList(SqList *sq)//元素个数
初始化
bool InitSqList(SqList *sq,int init_size)
{
if(sq == NULL||init_size < 0)
return false;
sq->data = (Datatype*)malloc(sizeof(Datatype)*init_size)//申请空间
if(sq->data == NULL)
return false;
sq->length = 0;
sq->size = init_size;
return true;
}
插入
bool InsertOfPos(SqList *sq,Datatype value,int pos)
{
if(sq == NULL)
return false;
if(pos < 0||pos > sq->length)
return false;
if(IsFull(sq) && !AppendSpace(sq))
return false;
//1、将Pos位置及其后面的元素往后移动 2、在pos位置插入value值 3、length++
for(int i = sq->length;i > pos;i--)
{
sq->data[i] = sq->data[i-1];
}
sq->data[pos] = value;
sq->length++;
return true;
}
//头插
bool InsertOfFront(SqList *sq,Datatype value)
{
return InsertOfPos(sq,value,0);
}
//尾插
bool InsertOfRear(SqList *sq,Datatype value)
{
if(sq == NULL)
return false;
return InsertOfPos(sq,value,sq->length);
}
判满
static bool IsFull(SqList *sq)
{
return sq->length == sq->size;
}
扩容
static bool AppendSpace(SqList *sq)
{
int size = sq->size == 0 ? 10 : sq->size * 2
Datatype *new_space = (Datatype*)malloc(sizeof(Datatype) * size)
if(new_space == NULL)
return false;
for(int i = 0;i < sq->length;i++)
{
new_space[i] = sq->data[i];
}
free(sq->data);
sq->data = new_space;
sq->size = size;
return true;
}
判空,销毁
bool DestroySqLIst(SqList *sq)
{
if(sq == NULL)
return false;
free(sq->data);
sq->data = NULL;
sq->length = sq->size = 0;
return true;
}
bool IsEmptySqList(SqList *sq)
{
if(sq == NULL||sq->length == 0)
return true;
return false;
}
删除
bool DeleteOfPos(SqList *sq,int pos)
{
if(sq == NULL)
return false;
if(pos < 0||pos >= sq->length)
return false;
//将pos位置后面的值统一向前移动一位
for(int i=pos;i < sq->length-1;i++)//考虑边界问题
{
sq->data[i] = sq->data[i+1];
}
sq->length--;
return true;
}
查找
int Search(SqList *sq,int key)
{
for(int i=0;i<sq->length;i++)
{
if(key == sq->data[i])
return i;
}
return -1;
}
插入算法总结:1、插入位置不合理。抛出异常
2、如果顺序表已满,则异常或者应当动态增加容量
3、将要插入的位置及后面的位置向后移动一位
4、插入value值
5、元素个数加1;
删除算法:1、删除位置不合理,抛出异常
2、取出删除元素
3、将删除位置后面的值统一向前移动一位
4、length–
顺序表:
1、插入数据的时间复杂度O(n),如果尾插时间复杂度为O(1)
2、删除数据的时间复杂度为O(n),尾删时间复杂度为O(1)
3、通过下标访问数据时间复杂度为O(1)
优点:可以快速的存取表中任意位置的元素
缺点:插入和删除操作需要大量移动元素