顺序表
顺序表的概念和定义
顺序表是有序存储数据的线性结构,一般表现为数组形式。有静态顺序表和动态顺序表之分。
静态顺序表
#define N 10
typedef int SeqListDataType;
typedef struct SeqList
{
SeqListDataType arr[N];//固定数组长度为N
int size;//有效数据个数
}SeqList;
动态顺序表
typedef int SeqListDataType;
typedef struct SeqList
{
SeqListDataType* arr;//指向动态数组的指针
int size;//有效数据个数
int capacity;//动态数组的空间大小
}SeqList;
接口函数
顺序表的初始化
void SeqListInit (SeqList* sql)
{
sql->arr = NULL;//让指针置空
sql->size = sql->capacity = 0;//有效数据个数和动态数组空间设为0
}
顺序表的销毁
void SeqListDestory (SeqList* sql)
{
assert(sql);
free(sql->arr);//free掉arr动态空间,记得及时将指针置空,防止野指针情况的发生
sql->arr = NULL;
sql->size = sql->capacity = 0;
}
顺序表的尾插
进行数据的插入,要判断是否需要扩容。
void CheckCapacity (SeqList* sql)
{
assert (sql);
if (sql->size == sql->capacity)//依据有效数据个数与空间大小的关系来判断空间是否足够插入一个数据
{
int new_capacity = sql->capacity == 0 ? 4 : 2 * sql->capacity;//运用三目运算符,如果sql->capacity为零则赋值为4,否则乘2来进行capacity的增大
SeqListDataType* new_arr = (SeqListDataType*)realloc(sql->arr, sizeof(SeqListDataType) * new_capacity);
if (new_arr == NULL)
{
printf("realloc failed"\n);
exit(-1);
}
}
sql->arr = new_arr;
sql->capacity = new_capacity;
}
尾插
void SeqListPushBack (SeqList* sql,SeqListDataType x)
{
CheckCapacity (sql);
sql->arr[sql->size] = x;//插入数据
sql->size++;//数据有效个数+1
}
顺序表的打印
void SeqListPrint (SeqList* sql)
{
assert(sql);
int i = 0;
while (i < sql->size)//遍历数组打印
{
printf("%d ",sql->arr[i]);
i++;
}
}
顺序表的头插
void SeqListPushFront (SeqList* sql,SeqListDataType x)
{
CheckCapacity (sql);//先检查,扩容
int end = sql->size - 1;//将整个顺序表的数据全往后面移动一位,为头插数据腾出空间
while ( end > 0)
{
sql->arr[end] = sql->arr[end - 1];
end = end - 1;
}
sql->arr[0] = x;//插入数据
sql->size++;//数据有效个数+1
}
顺序表的尾删
void SeqListPopBack (SeqList* sql)
{
asser(sql->size > 0);//防止删完了继续删
sql->size--;//数据有效个数-1
}
顺序表的头删
void SeqListPopFront (SeqList* sql)
{
assert(sql);
int begin = 0;
while (begin < sql->size -1)//将整个顺序表数据往前移动一位,直接覆盖掉表头数据
{
sql->arr[begin] = sql->arr[begin + 1];
begin++;
}
sql->size--;//
}
顺序表的下标查找
int SeqListSerch (SeqList* sql, SeqLsitDataType x)
{
assert (sql);
for (int i = 0; i < sql->size; i++)//遍历数组,找出数据等于x的下标,并返回
{
if (sql->arr[i] == x)
{
return i;
}
}
return -1;//找不到,返回-1
}
顺序表的指定下标插入
void SeqListInsert (SeqLsit* sql, int pos, SeqListDataType x)
{
assert (sql);
assert (pos >= 0 && pos <= sql->size)//确保pos在size内
CheckCapacity (sql);
int end = sql->size;
while (end >= pos)//将原先pos位置开始的数据全往后移动一位,为新的pos数据腾出空间
{
sql->arr[end] = sql->arr[end - 1];
end--;
}
sql->arr[pos] = x;//插入数据
sql->size++;
}
顺序表的指定下标删除
void SeqListEarse (SeqList* sql,int pos)
{
assert (sql);
assert (pos >= 0 && pos <= sql->size)
int cur = pos;
while (cur < sql->size)//直接将pos位置的数据pos - 1位的数据覆盖,并以此类推。类似于头删
{
sql->arr[cur] = sql->arr[cur + 1];
cur++;
}
sql->size--;
}