顺性表是什么
顺序表是线性表的的一种。线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
以下是对顺序表的初始化,删除,增删查改
顺序表初始化
void SeqListInit(SeqList* pq)
{
assert(pq);
pq->a = NULL;
pq->size = pq->capacity = 0;
}
销毁顺序表
void SeqListDestory(SeqList* pq)
{
assert(pq);
free(pq->a);
pq->a = NULL;
pq->size = pq->capacity = 0;
}
打印顺序表中的有效数据
void SeqListPrint(SeqList* pq)
{
assert(pq);
for (int i = 0; i < pq->size; i++)
{
printf("%d ", pq->a[i]);
}
printf("\n");
}
检查顺序表是否需要增容
void SeqCheckCapacity(SeqList* pq)
{
if (pq->size == pq->capacity)
{
int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;
SeqDataType* newA = realloc(pq->a, sizeof(SeqDataType) * newcapacity);
if (newA == NULL)
{
printf("realloc fail\n");
exit(-1);
}
pq->a = newA;
pq->capacity = newcapacity;
}
}
表尾增加
void SeqListPushBack(SeqList* pq, SeqDataType x)
{
assert(pq);
SeqCheckCapacity(pq);
pq->a[pq->size] = x;
pq->size++;
}
表头增加
void SeqListPushFront(SeqList* pq, SeqDataType x)
{
assert(pq);
SeqCheckCapacity(pq);
int end = pq->size - 1;
while (end >= 0)
{
pq->a[end + 1] = pq->a[end];
end--;
}
pq->a[0] = x;
pq->size++;
}
表尾删除
void SeqListPopBack(SeqList* pq)
{
assert(pq);
assert(pq->size > 0);
--pq->size;
}
表头删除
void SeqListPopFront(SeqList* pq)
{
assert(pq);
assert(pq->size > 0);
int begin = 0;
while (begin < pq->size-1)
{
pq->a[begin] = pq->a[begin + 1];
begin++;
}
pq->size--;
}
查找一个有效数据
int SeqListFind(SeqList* pq, SeqDataType x)
{
assert(pq);
for (int i = 0; i < pq->size; ++i)
{
if (pq->a[i] == x)
{
return i;
}
}
return -1;
}
在pos位处处插入一个新数据
void SeqListInsert(SeqList* pq, size_t pos, SeqDataType x)
{
assert(pq);
assert(pos >= 0 && pos <= pq->size);
SeqCheckCapacity(pq);
int end = pq->size - 1;
while (end >= pos)
{
pq->a[end + 1] = pq->a[end];
--end;
}
pq->a[pos] = x;
pq->size++;
}
删除pos位置处的数据
void SeqListErase(SeqList* pq, int pos)
{
assert(pq);
assert(pos >= 0 && pos < pq->size);
int begin = pos;
while (begin < pq->size)
{
pq->a[begin] = pq->a[begin + 1];
begin++;
}
pq->size--;
}
将pos位置处的数据修改
void SeqListModify(SeqList* pq, int pos, SeqDataType x)
{
assert(pq);
assert(pos >= 0 && pos < pq->size);
pq->a[pos] = x;
}