顺序表
**顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
头文件
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* array;
size_t size;
size_t capicity;
}SeqList;
//顺序表的初始化
void SeqListInit(SeqList* psl, size_t capacity);
//检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
//顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
//顺序表尾删
void SeqListPopBsck(SeqList* psl);
//顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
//顺序表头删
void SeqListPopFront(SeqList* psl);
//顺序表打印
void SeqListprint(SeqList* psl);
//顺序表的销毁
void SeqListDestory(SeqList* psl);
//顺序表的查找
void SeqListFind(SeqList* psl, SLDataType x);
//顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, SLDataType x, size_t pos);
//顺序表中删除pos位置的元素
void SeqListErase(SeqList* psl, size_t pos);
接口的实现
#include"seqlist.h"
//顺序表的初始化
void SeqListInit(SeqList* psl, size_t capacity)
{
psl->array = NULL;
psl->capicity = psl->size = 0;
}
//检查空间进行增容
void CheckCapacity(SeqList* psl)
{
//后面没有空间了,或者空间不足就进行扩容
if (psl->capicity == psl->size)
{
int Newcapicity = psl->capicity == 0 ? 4 : psl->capicity * 2;
SLDataType* tmp = (SLDataType*)calloc(psl->array, Newcapicity * sizeof(SLDataType));
if (tmp == NULL)
{
printf("calloc fail\n");
exit(-1);
}
psl->array = tmp;
psl->capicity = Newcapicity;
}
}
//顺序表尾插
void SeqLisrPushBsck(SeqList* psl, SLDataType x)
{
CheckCapacity(psl);
psl->array[psl->size] = x;
psl->size++;
}
//顺序表尾删
void SeqListPopBsck(SeqList* psl)
{
assert(psl->size > 0);
psl->size--;
}
//顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x)
{
CheckCapacity(psl);
//挪动数据
int end = psl->size - 1;
while (end >= 0)
{
psl->array[psl->size] = psl->array[end];
end--;
}
psl->array[0] = x;
psl->size++;
}
//顺序表头删
void SeqListPopFront(SeqList* psl)
{
assert(psl->size > 0);
int begin = 1;
while (begin < psl->size)
{
psl->array[begin - 1] = psl->size;
begin++;
}
psl->size--;
}
//顺序表打印
void SeqListprint(SeqList* psl)
{
for (int i = 0; i < psl->size; i++)
{
printf("%d ", psl->array);
}
printf("\n");
}
//顺序表的销毁
void SeqListDestory(SeqList* psl)
{
free(psl->array);
psl->array = NULL;
psl->capicity = psl->size = 0;
}
// 顺序表的查找
void SeqListFind(SeqList* psl, SLDataType x)
{
for (int i = 1; i < psl->size; i++)
{
if (psl->array[i] == x)
{
return i - 1;
}
}
printf("找不到\n");
return -1;
}
//顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, SLDataType x, size_t pos)
{
assert(pos >= 0 && pos <= psl->size);
CheckCapacity(psl);
int end = psl->size - 1;//end表示最后一个元素的下标
while (end >= pos)
{
psl->array[end] = psl->array[end - 1];
end--;
}
psl->array[pos] = x;
psl->size++;
}
//顺序表中删除pos位置的元素
void SeqListErase(SeqList* psl, size_t pos)
{
assert(pos >= 0 && pos <= psl->size);
int begin = pos + 1;
while (begin < psl->size)
{
psl->array[begin - 1] = psl->array[begin];
begin++;
}
psl->size--;
}