顺序表的基本操作C++

讲一讲顺序表吧
首先定义结构体老套路了
顺序表比较特别首先要分配好内存空间,给够空间,不够以后再来说要么扩容,扩容是倍增的扩容一会开小灶来讲就不放到主运行里了

**typedef int Elemtype;**讲一下这个,可能比较多人不太理解这什么意思,其实也是单纯的定义一个类型变量罢了(typedef的用法),只是这个名字改了一下,对于以后对程序的维护方便点而已,就是把int这个整型变量改名为Elemtype,以后要改类型就直接在int那里改成float,double,bool之类,比较方便;

#include<iostream>
using namespace std;
#define MAXSIZE 100  //先分配足够的内存然后起到一个动态分配的效果   
typedef int Elemtype;
typedef struct
{
	Elemtype* data;			//顺序表地址
	int length;				//顺序表的长度
}Mylist;//Mylist是结构体名字别混淆了,老套路了

那么下一步构建了结构体那接下来肯定是做初始化操作啦
初始化:
当然有人会好奇那个会增加代码的强健性,不详讲自己查资料
所谓初始化就是有指针的就开辟内存空间然后长度变为0嘛

bool Init_List(Mylist& L)//bool可增强代码的强健性 
{
	L.data = new int[MAXSIZE];//在堆区开辟内存空间
	if (L.data == NULL)//如果创建失败
		return false;
	L.length = 0;//初始化顺序表的长度
	cout << "顺序表初始化完成!" << endl;
	return true;//创建成功后
}

初始化完下一步就是存入数据啦
思路嘛在这里给大家捋一捋:
1.首先要做的就是防止溢出的效果 就是要输入的元素个数防止超出原先定义的最大值也就是MASIZE;
2.对一维数组的输入应该都熟悉吧一维数组就一层for循环 二维就两层不懂回去看资料吧挺基础的以后还是很常用的;
3.这里有个小操作,就是你选择输入多少个数据的时候,默认性的决定了数组的大小,那这时候只需要让长度等于你选择的大小就行了,所以有L.length=n;这个操作;

void Input_Elem(Mylist& L, int n)//在顺序表中放入n个元素
{
	if (n >= MAXSIZE)   //防止溢出
	{
		cout << "容量溢出无法录入数据" << endl;
		return;
	}
	cout << "请开始输入" << n << "个元素:";
	for (int i = 0; i < n; i++)//往顺序表中输入元素
	{
		cin >> L.data[i];
	}
	L.length = n;
}

有个数据了,那这时候我们可以选择做很多事,比如查找,打印等
那这里先来个打印吧
打印(也就是显示啦):
那么也说一下思路吧:
1.首先判断有没有元素,这个当然可以自己外部写个判空的函数都一样的这里我就直接自己写!毕竟豪横嘛;如果数组为空(也就是长度是不是为0啦)如果是那就退出并且做个提醒,不是的话下一步!
2.来了 刚还提了一嘴数组怎么输入挺重要的,那这输出也很重要,其实我个人有个口诀 “对于数组存值怎么进去就怎么出来” for循环进去那就for循环出来

void Show_List(Mylist L)
{
	if (L.length == NULL)
	{
		cout << "请先输入数据才能查询!" << endl;
		return;
	}
	cout << "顺序表的内容元素:";
	for (int i = 0; i < L.length; i++)
	{
		cout << L.data[i] << " ";
	}
	cout << endl;
}

好!又搞定一个那接下来再来讲解一下插入元素吧
思路来了:
1.首先判断这个数组是否已经满了 满了退出并提示该扩容了,这里扩容还没那就一会再说
2.插入的范围这里有讲究了,首先不能插到数组外去叭那就下标不能为负嘛,然后不能大于最大长度为什么+1,因为数组下标从0开始
3.范围对了又没满怎么插入数据呢?首先!循环,这里采用自减的操作,至于为什么,为了方便后面的操作,减少时间成本嘛。后面的操作完了我前面就不用动了多方便;
好 回归正题!把原来在那个位置上占着的那个值后移一位腾个空间出来
也就是 L.data[j + 1] = L.data[j];
4.把数据传进去,传进去后别忘了增加了数据就增加了长度 让长度自增1;

bool Insert_Elem(Mylist& L, int pos, int value) //插入元素
{
	if (L.length > MAXSIZE)
	{
		cout << "容量满了无法再插入元素" << endl;
		return false;
	}
	if (pos > L.length + 1 || pos <= 0)
	{
		cout << "无法在不允许的范围内插入元素" << endl;
		return false;
	}

	for (int j = L.length - 1; j > pos - 1; j--)
	{
		L.data[j + 1] = L.data[j];  //往后移保存元素
	}
	L.data[pos] = value; //在对应位置插入元素
	L.length++;  //插入元素长度增加
	return true;
}

删除操作:
好再讲解删除,有时候删除操作比较让人头疼,但在这里,只需要把插入操作稍微修改一下就行了
讲讲主要思路吧
判空还有位置范围就不讲了没懂就看前面,从当前位置开始,然后自增别过范围了哈,把后面的数据都往前面移动一位就行了;**为什么从当前位置开始?**因为你要删除的位置之前的数据是不用往前移动的,放着不就好了何必增加时间复杂度?只对后面动刀就行了,删了一个了那要记得长度减少一个哦

bool Delete_Elem(Mylist& L, int pos)
{
	if (L.length == NULL)
	{
		cout << "请先输入数据才能进行这个操作!" << endl;
		return -1;
	}

	if (pos > L.length + 1 || pos <= 0)
	{
		cout << "位置超出范围无法进行删除操作" << endl;
		return false;
	}

	for (int j = pos - 1; j < L.length - 1; j++)
	{
		L.data[j] = L.data[j + 1];
	}
	L.length--;

	return true;

}

扩容操作:
来了 开个小灶!!其实也就是讲讲扩容 先说好不放进主函数里实现,不是不对!是没必要,测试而已,以后要用到再说,体会一下就行 稍微讲讲思路
**思路!:**前面其实已经说过了,扩容是倍增试的扩容,具体为什么倍增,你扩容只扩一点点有意思?没意思吧?没意思就对了 那就别问了 再问自己查资料。
讲解一下代码:
1.首先!判断是不是满了或者溢出了,如果溢出了那我们就来扩容一波,记住是倍增的扩容 当然还有一些别的操作的扩容反正都差不多;
2.扩容也就是开辟一个新空间,然后把旧的数据传进去,**通俗点!**就是拿一个新的空的大瓶子装一个装满水的小瓶子!怎么装?老规矩了!对数组没事就上循环!
3.装完了数据了该干嘛? 那就把旧的空间给扔了太小了满足不了我了 我不要了。通俗点! 就是小的瓶子的东西倒过来了我后面还要装东西我可以直接用大瓶子了这个小瓶子用过了我嫌弃就丢了(有钱!);当然用在内存里就不是有钱了,内存宝贵别多放一个没用的空间占用了;

bool dilatancy(Mylist &L)
{

	if (L.length >= MAXSIZE)
	{
		int NewMAXSIZE = MAXSIZE * 2;
		Elemtype* arr = new Elemtype[NewMAXSIZE];
		for (int i = 0; i < NewMAXSIZE; i++)
		{
			arr[i] = L.data[i];
		}
		delete L.data;//删除旧的空间别占用资源了!
		return true}
	else
	return false}

接下来!就是主要实现了!直接看吧,该讲解的基本讲解了

#include<iostream>
using namespace std;
#define MAXSIZE 50     
typedef int Elemtype;
typedef struct
{
	Elemtype* data;			//顺序表地址
	int length;				//顺序表的长度
}Mylist;

void Show_menu()
{
	cout << "                  *************************" << endl;
	cout << "                  *1.输入1可输入顺序表元素*" << endl;
	cout << "                  *2.输入2可查询顺序表元素*" << endl;
	cout << "                  *3.输入3可随意的插入元素*" << endl;
	cout << "                  *4.输入4可随意的删除元素*" << endl;
	cout << "                  *5.输入5可随时退出程序***" << endl;
	cout << "                  *************************" << endl;
}

bool Init_List(Mylist& L)//bool可增强代码的强健性
{
	L.data = new int[MAXSIZE];
	if (L.data == NULL)//如果创建失败
		return false;
	L.length = 0;//初始化顺序表的长度
	cout << "顺序表初始化完成!" << endl;
	return true;//创建成功后
}

void Input_Elem(Mylist& L, int n)//在顺序表中放入n个元素
{
	if (n >= MAXSIZE)   //防止溢出
	{
		cout << "容量溢出无法录入数据" << endl;
		return;
	}
	cout << "请开始输入" << n << "个元素:";
	for (int i = 0; i < n; i++)//往顺序表中输入元素
	{
		cin >> L.data[i];
	}
	L.length = n;

}

void Show_List(Mylist L)
{
	if (L.length == NULL)
	{
		cout << "请先输入数据才能查询!" << endl;
		return;
	}
	cout << "顺序表的内容元素:";
	for (int i = 0; i < L.length; i++)
	{
		cout << L.data[i] << " ";
	}
	cout << endl;

}

bool Insert_Elem(Mylist& L, int pos, int value) //插入元素
{

	if (L.length > MAXSIZE)
	{
		cout << "容量满了无法再插入元素" << endl;
		return false;
	}
	if (pos > L.length + 1 || pos <= 0)
	{
		cout << "无法在不允许的范围内插入元素" << endl;
		return false;
	}

	for (int j = L.length - 1; j > pos - 1; j--)
	{
		L.data[j + 1] = L.data[j];  //往后移保存元素
	}
	L.data[pos] = value; //在对应位置插入元素
	L.length++;  //插入元素长度增加

	return true;
}

bool Delete_Elem(Mylist& L, int pos)
{
	if (L.length == NULL)
	{
		cout << "请先输入数据才能进行这个操作!" << endl;
		return -1;
	}

	if (pos > L.length + 1 || pos <= 0)
	{
		cout << "位置超出范围无法进行删除操作" << endl;
		return false;
	}

	for (int j = pos - 1; j < L.length - 1; j++)
	{
		L.data[j] = L.data[j + 1];
	}
	L.length--;

	return true;

}


int main()
{
	Show_menu();
	Mylist L;
	Init_List(L);
	int select;
	while (true)
	{
		cout << "请选择您想要进行的步骤:";
		cin >> select;
		switch (select)
		{
		case 1:
			int n;//需要输入的元素大小
			cout << "需要输入元素个数:";
			cin >> n;
			Input_Elem(L, n);
			break;
		case 2:
			Show_List(L);
			break;
		case 3:
			int pos;
			cout << "请输入要插入的位置以及值:";
			
			int value;
			
			cin >> pos>>value;
			Insert_Elem(L, pos, value);
			break;
		case 4:
			int locate;
			cout << "请输入你要删除的位置:";
			cin >> locate;
			Delete_Elem(L, locate);
			break;
		case 5:
			exit(-1);
		}
	}
	return 0;
}
  • 14
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值