C++顺序表动态分配功能集合(含代码)
目录
- 总结归纳
- 功能描述
- 代码段
- 运行截图
总结归纳
- 这是一个C++数据结构顺序表动态分配各种功能实现博客
- 顺序表插入查找删除最好时间复杂度为O(1),最差为O(n)
- 顺序表的插入,从后往前遍历,数据后移;当插入位置为第i个结点时需要移动n-i+1个元素
- 顺序表的删除,从前往后遍历,数据前移;当删除位置为第i个结点时需要移动n-i个元素
- 删除数据只需length=0即可,可以重新填入数据
- 销毁数据后不可再次使用
功能描述
- 初始化顺序表
- 追加最大空间
- 插入元素
- 删除元素
- 获取第i个元素信息
- 按值查找操作
- 获取列表长度
- 显示列表全部数据
- 清空列表全部数据
- 释放列表空间
5和9没在main函数里实现,很简单,大家可以自己使用
代码实现
#include<iostream>
#define MAXSIZE 50
#define INITSIZE 5 //初始化空间
#define OVERFLOE 0 //空表传递出来的值
#define OK 1 //代码执行成功
#define ERROR -1 //位置不合法/列表已满
using namespace std;
typedef int elemType;
//静态分配数组
typedef struct {
elemType data[MAXSIZE];
int length;
}sqlist;
//动态分配数组
typedef struct {
elemType* data;
int length, maxsize;
}Sqlist;
//初始化操作,创建一个空表
int initSqList(Sqlist& l) {
l.data = new elemType[INITSIZE];
if (l.data == NULL)
exit(OVERFLOE);
l.length = 0;
l.maxsize = INITSIZE;
return OK;
}
//追加空间操作
int IncreaseSize(Sqlist& l, int len)
{
elemType* p = l.data;
l.data = new elemType[INITSIZE + len];
for (int i = 0; i < l.length; i++)
l.data[i] = p[i];
l.maxsize = l.maxsize + len;
delete[]p;
return OK;
}
//插入操作
int ListInsert(Sqlist& l, int i, elemType e)
{
if (i<1 || i>l.length + 1)
return ERROR;
if (l.length > l.maxsize)
return ERROR;
for (int j = l.length; j >= i; j--)
l.data[j] = l.data[j-1];
l.data[i - 1] = e;
l.length++;
return OK;
}
//删除操作
int ListDelete(Sqlist& l, int i)//如果需要将删除的数据传出,可以在参数列表里加上elemType& e,和下面注释代码
{
if (i<1 || i>l.length)
return ERROR;
//e = l.data[i-1];
for (int j = i; j < l.length; j++)
l.data[j - 1] = l.data[j];
l.length--;
return OK;
}
//获取第i个元素的信息
int GetElem(Sqlist l, int i, elemType& e)//e传递出第i个元素的值必须使用&符号
{
if (i<1 || i>l.length)
return ERROR;
e = l.data[i - 1];
return OK;
}
//按值查找操作
int LocateElem(Sqlist l, elemType e)
{
if (l.data == NULL)
exit(OVERFLOE);
for (int i = 0; i < l.length; i++)
if (l.data[i] == e)
return i + 1;
return 0;
}
//获取列表长度
void length(Sqlist l)
{
cout << "当前列表的长度为:" << l.length << endl;
cout << "当前列表的最大长度为:" << l.maxsize << endl;
}
//显示列表全部数据
int showList(Sqlist l)
{
if (l.data == NULL)
return ERROR;
for (int i = 0; i < l.length; i++)
cout << l.data[i] << " ";
return OK;
}
//清空列表全部数据
int clearList(Sqlist& l) {
l.length = 0;
return OK;
}
//释放l的空间
int DestroyList(Sqlist& l)
{
if (l.data != NULL)
delete l.data;
l.length = 0;
l.maxsize = 0;
return 0;
}
int main()
{
Sqlist l;
int ch, i;
while (true)
{
cout << "请输入功能序号:"; cin >> ch;
switch (ch) {
case 1://初始化列表
{
int creatResult = initSqList(l);
if (creatResult == OK)
cout << "函数初始化成功。" << endl;
else
cout << "函数初始化失败。" << endl;
break;
}
case 2://追加列表最大空间
{
int len;
cout << "请输入需要增加的最大空间数"; cin >> len;
int addResult = IncreaseSize(l, len);
if (addResult == OK)
cout << "列表追加空间成功" << endl;
else
cout << "列表追加空间失败" << endl;
break;
}
case 3://插入操作
{
elemType e;
cout << "请分别输入需要插入的位置和需要插入的值"; cin >> i; cin >> e;
int insertResult = ListInsert(l, i, e);
if (insertResult == OK)
cout << "插入成功" << endl;
else if (insertResult = ERROR)
cout << "输入位置不合法或空间已满" << endl;
break;
}
case 4://删除操作
{
cout << "获取第i个位置数据信息:"; cin >> i;
int deleteResult = ListDelete(l, i);
if (deleteResult == OK)
cout << "删除成功" << endl;
else if (deleteResult = ERROR)
cout << "输入位置不合法或列表已空" << endl;
break;
}
case 5://查询操作
{
elemType e;
cout << "输入需要查询的值"; cin >> e;
int locateResult = LocateElem(l, e);
if (locateResult == 0)
cout << "查询失败" << endl;
else
cout << "数据" << e << "在" << i << "位置" << endl;
break;
}
case 6://显示列表全部数据
{
int showResult = showList(l);
if (showResult == ERROR)
cout << "列表已为空。" << endl;
if (showResult == OK)
cout << "显示成功" << endl;
break;
}
case 7://获取列表长度
length(l);
break;
case 8://销毁列表
{
int destroyResult = DestroyList(l);
if (destroyResult == 0)
cout << "销毁成功" << endl;
break;
}
}
}
return 0;
}
运行截图![亲自试验](https://i-blog.csdnimg.cn/blog_migrate/8107c90843a4e338d8f1c3c260a46999.png)
亲自试验,代码运行没有任何问题,健壮性可能或有不足,如有问题可以私信,看到会解决
感谢查看,别忘了点赞关注,你的支持是作者最大的动力。