SeqList.c
#include"SeqList.h"
void SeqListPrint(SL* ps)//对其打印
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListInit(SL* ps)//用地址初始化
{
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListCheckCapacity(SL* ps)//空间扩容
{
//如果没有空间或者空间不走就进行扩容
if (ps->size == ps->capacity)//如果存的数满了
{
//因为初始化了,如果刚开始为0,就赋值4,如果不为0,就扩2倍
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//扩容函数realloc,如果第一次为NULL,则相当于malloc,放回值是void*,非配的内容a,单位是字节
SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
if (tmp == NULL)//扩容失败为NULL
{
printf("realloc fail\n");
exit(-1);//扩容失败就退出
}
ps->a = tmp;//把开辟的空间给a
ps->capacity = newcapacity;//把开辟的容量给newcapacity
}
}
void SeqListPushBack(SL* ps, SLDataType x)//数据尾插
{
SeqListCheckCapacity(ps);//空间扩容
ps->a[ps->size] = x;//如果不满,则挨着存,然后++;
ps->size++;
}
void SeqListDestory(SL* ps)//把用过的数据表销毁
{
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListPopBack(SL* ps)//数据尾删
{
if (ps->size > 0)//第一种方法
{
ps->size--;//删除数据
}
//第二种方法用断言
//assert(ps->size > 0);
//ps->size--;
}
void SeqListPushFront(SL* ps, SLDataType x)//数据头插
{
SeqListCheckCapacity(ps);//空间扩容
//挪动数据
int end = ps->size - 1;
while (end >= 0)
{
ps->a[end + 1] = ps->a[end];//把数往后挪动一位
--end;
}
//把数字放在头位置
ps->a[0] = x;
ps->size++;
}
void SeqListPopFront(SL* ps)//数据头删
{
assert(ps->size > 0);
int begin = 1;
while (begin< ps->size)
{
ps->a[begin - 1] = ps->a[begin];//往前挪动
++begin;
}
ps->size--;
}
int SeqListFind(SL* ps, SLDataType x)//查找数据,如果找到返回下标,找不到返回-1.
{
//int begin = 0;
//while (beginsize)
//{
// if (ps->a[begin] == x)
// return begin;
// else
// ++begin;
//}
//return -1;
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
//void SeqListInsert(SL* ps, int pos, SLDataType x)//在pos出插入,第2个插入5
//{
// SeqListCheckCapacity(ps);//空间扩容
// int end = ps->size - 1;
// while (end >= 0)//往后面的后挪
// {
// ps->a[end + 1] = ps->a[end];
// if (end == pos - 1)
// {
// break;
// }
// --end;
// }
// ps->a[pos - 1] = x;
// ps->size++;
//}
void SeqListInsert(SL* ps, int pos, SLDataType x)//在pos出插入,第2个插入5
{
assert(pos >= 0 && pos <= ps->size);
SeqListCheckCapacity(ps);//空间扩容
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
//void SeqListErase(SL* ps, int pos, SLDataType x)//在指定的位置pos删除,第2个位置删除10在
//{
// int begin = pos - 1;
// if (ps->a[begin] == x)
// {
// for (begin = pos - 1; begin < ps->size; begin++)
// {
// ps->a[begin ] = ps->a[begin+1];//往前挪动
// }
// ps->size--;
// }
//}
void SeqListErase(SL* ps, int pos)//在指定的位置pos删除,第2个位置删除10在
{
assert(pos >= 0 && pos < ps->size);
int begin = pos + 1;
while (begin < ps->size)
{
ps->a[begin] = ps->a[begin + 1];
++begin;
}
ps->size--;
}
SeqList.h
#pragma once
//#define N 100
typedef int SLDataType;//把int 类型重定义为SLDataType
#include
#include
#include
//动态数据表
typedef struct SeqList
{
SLDataType* a;//把数据存到数组中,开辟的动态空间用的是指针
int size;//数组中存了多少数据
int capacity;//表示实际能存数据空间容量的大小
}SL;
//接口函数
void SeqListInit(SL* ps);//初始化
void SeqListDestory(SL* ps);//把用过的数据表销毁
void SeqListCheckCapacity(SL* ps);//空间扩容
void SeqListPushBack(SL* ps, SLDataType x);//数据尾插
void SeqListPopBack(SL* ps);//数据尾删
void SeqListPushFront(SL* ps, SLDataType x);//数据头插
void SeqListPopFront(SL* ps);//数据头删
int SeqListFind(SL* ps,SLDataType x);//查找数据,如果找到返回下标,找不到返回-1.
void SeqListInsert(SL* ps, int pos, SLDataType x);//在指定的位置pos出插入
void SeqListErase(SL* ps, int pos, SLDataType x);//在指定的位置pos删除
main.c
#include"SeqList.h"
void TestSeqList()
{
SL s1;
SeqListInit(&s1);//传地址进行初始化
SeqListPushBack(&s1, 1);//数据尾插
SeqListPushBack(&s1, 2);
SeqListPrint(&s1);//打印函数
SeqListPushFront(&s1, 10);//头插
SeqListPushFront(&s1, 9);
SeqListPrint(&s1);//打印函数
int ret=SeqListFind(&s1, 8);//查找表中的值,返回下标
if (ret == -1)
{
printf("没找到\n");
}
else
printf("找到了下标为=%d\n",ret);
SeqListInsert(&s1, 8, 15);//在任意位置插入
SeqListInsert(&s1, 9, 16);//在任意位置插入
SeqListPrint(&s1);//打印函数
SeqListErase(&s1, 12, 9);//在任意位置删除
SeqListErase(&s1, 13, 10);//在任意位置删除
SeqListPrint(&s1);//打印函数
SeqListDestory(&s1);//销毁函数
}
int main()
{
TestSeqList();//顺序表的各种操作
return 0;
}