C++顺序表动态分配功能集合(含代码)

C++顺序表动态分配功能集合(含代码)

目录

  1. 总结归纳
  2. 功能描述
  3. 代码段
  4. 运行截图

总结归纳

  1. 这是一个C++数据结构顺序表动态分配各种功能实现博客
  2. 顺序表插入查找删除最好时间复杂度为O(1),最差为O(n)
  3. 顺序表的插入,从后往前遍历,数据后移;当插入位置为第i个结点时需要移动n-i+1个元素
  4. 顺序表的删除,从前往后遍历,数据前移;当删除位置为第i个结点时需要移动n-i个元素
  5. 删除数据只需length=0即可,可以重新填入数据
  6. 销毁数据后不可再次使用

功能描述

  1. 初始化顺序表
  2. 追加最大空间
  3. 插入元素
  4. 删除元素
  5. 获取第i个元素信息
  6. 按值查找操作
  7. 获取列表长度
  8. 显示列表全部数据
  9. 清空列表全部数据
  10. 释放列表空间

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;
}

运行截图亲自试验

亲自试验,代码运行没有任何问题,健壮性可能或有不足,如有问题可以私信,看到会解决
感谢查看,别忘了点赞关注,你的支持是作者最大的动力。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Oner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值