顺序表的简单实现
基于c++的简单实现顺序表,动态管理内存
本人萌新,如果有哪个术语或者代码思路有问题,欢迎指正,谢谢!!!
1.自定义结构体,存储数据
//常量定义
#define InitSize 10
#define AddSize 5
// 定义结构体顺序表
typedef struct sqList
{
/* data */
// 存储数据
int *data; // 动态添加数据
int max_size; // 表示一次性能存储多少个数据
int length; // 表示有多少个数据
} SqList;
2.初始化顺序表
// 初始化顺序表
void InitList(SqList &s)
{
s.data = (int *)malloc(InitSize * sizeof(int));
s.max_size = InitSize;
s.length = 0;
for (int i = 0; i < s.max_size; i++)
{
/* code */
/* if (i < 5)
{
s.data[i] = i * i;
s.length++;
}
else
{
s.data[i] = 0;
} */
//这样定义数据是为了查看扩容是否成功
s.data[i] = i * i;
s.length++;
}
}
3销毁开辟的数据空间
在内存中开辟了空间就要记得销毁,防止内存泄漏
// 销毁顺序表
void DestroyList(SqList &s)
{
free(s.data);
}
4.顺序表的打印
先写该代码是为了方便查看最后的结果是否正确,比如顺序表是否正确的初始化了
// 打印顺序表
void PrintList(SqList &s)
{
for (int i = 0; i < s.length; i++)
{
/* code */
printf("%d\t", s.data[i]);
}
printf("\n");
}
5.往顺序表中插入数据
如果插入数据过多,空间会不够,为了空间足够这里先写数组扩容的代码
// 动态开辟空间
// 第一个参数表示需要扩容的空间
// 第二个参数表示需要扩容的大小
void ExpandList(SqList &s, int n)
{
int *dataArr = (int *)malloc((s.max_size + AddSize) * sizeof(int));
for (int i = 0; i < s.length; i++)
{
/* code */
dataArr[i] = s.data[i];
}
s.data = dataArr;
s.max_size = InitSize + AddSize;
}
// 插入元素
// 第一个参数表示需要插入元素的空间
// 第二个参数表示需要在数组中插入数据的位置
// 第三个参数表示需要插入的元素
bool InsertList(SqList &s, int index, int value)
{
// 先对index进行判断
if (index < 1 || index > s.length+1)
return false;
// 对长度进行判断,如果存入数据的长度大于最大能存储元素的个数,则需要进行扩容
if (s.length == s.max_size)
{
/* code */
ExpandList(s, AddSize);
printf("扩容成功!\n");
}
// 代码运行到这,表示可以进行插入元素操作
// 将该位置的数据全部往后移一位
for (int i = s.length; i >= index; i--)
{
/* code */
s.data[i] = s.data[i - 1];
}
// 将value赋值给该位置上
s.data[index - 1] = value;
s.length++;
return true;
}
6.在顺序表中删除数据
// 删除元素
//第一个参数表示删除元素的数组
//第二个参数表示删除元素的索引位置
//第三个参数表示返回删除的元素,可以告诉我们删了哪什么元素
bool DeleteList(SqList &s, int index, int &e)
{
//对index进行判断
//如果index大于数组存储的个数,失败
if(index < 1 || index > s.length)
{
return false;
}
//代码执行到这表示可以删除元素
//删除该位置的元素,将后面元素的数据都往前一个位置
e = s.data[index-1];
for (int i = index-1; i < s.length; i++)
{
/* code */
s.data[i] = s.data[i+1];
}
s.length--;
return true;
}
7.在顺序表中查找数据
查找数据分位按值查找数据,按位置查找数据
//查找值查找元素所在位置
int SearchByVal(SqList &s, int value)
{
//遍历数据数组
for (int i = 0; i < s.length; i++)
{
/* code */
if (s.data[i] == value)
{
/* code */
return i+1;
}
}
return 0;
}
//根据位置查找值
int SearchByIndex(SqList &s, int index)
{
if(index > s.length)
{
return 0;
}
return s.data[index-1];
}
最终完整代码
请点击链接或访问https://gitee.com/lanlee0216/sequential-table.git