顺序表:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
一般可分为两种
1.静态顺序表:定长数组储存。
#define N 1000
typedef int SLDataType;
typedef struct SeqList
{
SLDataTyepe a[N];//定长数组
size_t size;//有效数字
}SeqList;
由于静态顺序表会浪费许多的空间,因此我们选择第二种,如下:
2.动态顺序表: 动态开辟数组储存。
typedef int SLDataType
//使用typedef 形式,当录入数据形式改变时
// 可以将Int改成其他形式,无需在程序中将全部的int改为其他形式。
typedef struct SeqList
{
SLDataType* a;//指向动态开辟的数组
size_t size;//有效数据个数
size_t capacity;//数组的容量
}SeqList;
下面我们来实现最简单的增删查改:
game.h
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组
size_t size ; // 有效数据个数
size_t capicity ; // 容量空间的大小
}SeqList;
// 基本增删查改接口
void SeqListInit(SeqList* psl, size_t capacity);//顺序表的初始化
void SeqListDestory(SeqList* psl);//顺序表的释放
void CheckCapacity(SeqList* psl);//扩容
void SeqListPushBack(SeqList* psl, SLDataType x);//尾部插入
void SeqListPopBack(SeqList* psl);//尾部删除
void SeqListPushFront(SeqList* psl, SLDataType x);//头部插入
void SeqListPopFront(SeqList* psl);//头部删除
int SeqListFind(SeqList* psl, SLDataType x);//查找某一个数,是否存在顺序表中
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);//在一个数的后方插入
void SeqListErase(SeqList* psl, size_t pos);//判断是否为空
void SeqListRemove(SeqList* psl, SLDataType x);//删除顺序表中的x
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);//更改x的值
void SeqListPrint(SeqList* psl);//打印输入动态顺序表的值
实现代码:
game.h
void SeqListInit(SeqList* psl, size_t capacity)
{
psl->_array = (SLDataType*)malloc(sizeof(SLDataType)*capacity);
//扩容
psl->_size = 0;
psl->_capicity =capacity;
}
void SeqListDestory(SeqList* psl)
{
assert(psl);
free(psl->_array );
psl->_array = NULL;
psl->_size = 0;
psl->_capicity = 0;
}
void CheckCapacity(SeqList* psl)
{
if(psl->_capicity ==psl->_size )//判断是否需要增容
{
SLDataType* tmp;
tmp = realloc(psl->_array ,psl->_capicity * 2 * sizeof(SLDataType));
assert(tmp);
psl->_array =tmp;
psl->_capicity *= 2;
}
}
void SeqListPushBack(SeqList* psl, SLDataType x)
{
assert(psl);
CheckCapacity(psl);
psl->_array [psl->_size] = x;
psl->_size ++;
}
void SeqListPrint(SeqList* psl)
{
size_t i = 0;
assert(psl);
for(i=0;i<psl->_size ;i++)
printf("%d ", psl->_array [i]);
}
void SeqListPopBack(SeqList* psl)
{
assert(psl);
psl->_size --;
}
void SeqListPushFront(SeqList* psl, SLDataType x)//头插
{
int end = psl->_size -1;
assert(psl);
CheckCapacity(psl);
while(end >= 0)
{
psl->_array [end + 1] = psl->_array [end];
//先将数组的前一位移到数组中的后一位上。
--end;
}
psl->_array[0] = x;
psl->_size++;
}
void SeqListPopFront(SeqList* psl)
{
size_t end = psl->_size ;
size_t begin = 0;
while(begin<end)
{
psl->_array[begin] = psl->_array [begin+1];
//直接用后一个数填补前一个数
begin++;
}
psl->_size --;
}
int SeqListFind(SeqList* psl, SLDataType x)
{
size_t i = 0;
for(i=0; i<psl->_size ;i++)//遍历整个数组
{
if(psl->_array [i] == x)
return i;
}
return -1;
}
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
size_t end = psl->_size;
while(end>pos)
{
psl->_array [end+1] = psl->_array [end];
//和头插同理,先将pos后的数++,再将x插入pos中。
end--;
}
psl->_array [pos] = x;
psl->_size ++;
}
void SeqListErase(SeqList* psl, size_t pos)//删除 pos
{
size_t begin = pos;
while(begin< psl->_size -1)
{
psl->_array [begin] = psl->_array [begin+1];
begin++;
}
psl->_size --;
}
void SeqListEmpty(SeqList* psl)//将数组清空
{
size_t i = 0;
assert(psl);
for(i=0;i<psl->_size -1; i++)
{
psl->_array [i] = 0;
}
psl->_size = 0;
}
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
size_t i = 0;
assert(psl && pos>psl->_size );
for(i=0;i<psl->_size ;i++)
{
if(psl->_array [i] = psl->_array [pos])
psl->_array [pos] = x;
}
}
void SeqListBubbleSort(SeqList* psl)//冒泡排序
{
size_t i = 0;
for(i=0;i<psl->_size-1 ;i++)
{
size_t j = 0;
for(j=0; j<psl->_size-i-1 ;j++)
{
if(psl->_array [j] > psl->_array [j+1])
{
size_t tmp = psl->_array [j+1];
psl->_array [j+1] = psl->_array [j];
psl->_array [j] = tmp;
}
}
}
}
int SeqListBinaryFind(SeqList* psl, SLDataType x)//二分查找
{
size_t begin = 0;
size_t end = psl->_size -1;
while(begin<=end)
{
SLDataType mid;
mid = end+(begin-end);
if(x == psl->_array [mid])
return mid;
else if(x < psl->_array [mid])
end = mid-1;
else if(x > psl->_array [mid])
begin = mid+1;
}
return 0;
}