和上一篇文章不同,此文章使用动态内存分配,使得线性表的表长可以扩展,使用更加灵活。
#include<iostream>
using namespace std;
#define InitSize 10
typedef struct {
int *data;
int MaxSize;
int length;
}SqList;
//查看表的状态
void ListStatus(const SqList& L)
{
cout << endl;
cout << "表长为" << L.length << endl;
cout << "表元素为";
for (int i = 0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
cout << "剩余可用空间为" << L.MaxSize - L.length << endl;
}
//初始化
int InitList(SqList &L)
{
L.data = new int(InitSize);
L.length = 0;
L.MaxSize = InitSize;
ListStatus(L);
return 0;
}
//增加表的长度
int IncreaseList(SqList& L, int len)
{
int* p = L.data;
L.MaxSize += len;
L.data = new int(L.MaxSize);
for (int i = 0; i < L.length; i++)
L.data[i] = p[i];
delete p;
cout << "增加" << len << "个容量";
ListStatus(L);
return 1;
}
//第i位插入元素
int InsertElement(SqList& L, int i, int e)
{
if (i<1 || i>L.length + 1)
{
cout << "不能在该位置插入元素" << endl;
return 2;
}
if (L.length >= L.MaxSize)
{
cout << "表已满,请扩容后再插入新元素" << endl;
return 2;
}
for (int j = L.length; j > i; j--)
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
ListStatus(L);
return 3;
}
//删除表中的第i位元素
int DelElement(SqList& L, int i)
{
if (i<1 || i>L.length)
{
cout << "删除位置不符合逻辑" << endl;
return 4;
}
if (L.length == 0)
{
cout << "表中已无元素" << endl;
return 4;
}
for (int j = i; j < L.length; j++)
L.data[j - 1] = L.data[j];
cout << "删除的元素值为" << L.data[i - 1];
L.length--;
ListStatus(L);
return 5;
}
//修改表中第i个元素的值
int ModifyElement(SqList& L, int i, int e)
{
if (i<1 || i>L.length)
{
cout << "表中共有" << L.length << "个元素" << "第" << i << "个元素不存在" << endl;
return 6;
}
L.data[i - 1] = e;
ListStatus(L);
return 7;
}
//根据下标查找表中的元素
int SearchEle_Order(const SqList& L, int i)
{
if (i<1 || i>L.length)
{
cout << "表中共有" << L.length << "个元素" << "第" << i << "个元素不存在" << endl;
return 8;
}
else
{
cout << "第" << i << "个元素为" << L.data[i - 1] << endl;
return 9;
}
}
//根据值查找元素
int SearchEle_Value(const SqList& L, int e)
{
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == e)
{
cout << "表中存在值为" << e << "的元素,为表中第" << i + 1 << "个元素" << endl;
return 11;
}
}
cout << "表中不存在值为" << e << "的元素" << endl;
return 10;
}
void FunctionSattus(int n)
{
switch (n)
{
case 0:
cout << "初始化成功!\n" << endl;
break;
case 1:
cout << "表长增加成功!\n" << endl;
break;
case 2:
cout << "插入失败!\n" << endl;
break;
case 3:
cout << "插入成功!\n" << endl;
break;
case 4:
cout << "删除失败!\n" << endl;
break;
case 5:
cout << "删除成功!\n" << endl;
break;
case 6:
cout << "修改失败!\n" << endl;
break;
case 7:
cout << "修改成功!\n" << endl;
break;
case 8:
cout << "按下标查找失败!\n" << endl;
break;
case 9:
cout << "按下标查找成功!\n" << endl;
break;
case 10:
cout << "按值查找失败!\n" << endl;
break;
case 11:
cout << "按值查找成功!\n" << endl;
break;
default:
cout << "无对应函数操作的结果返回!\n" << endl;
break;
}
}
int main()
{
int ret;
SqList L1;
ret = InitList(L1);
FunctionSattus(ret);
ret = IncreaseList(L1, 2);
FunctionSattus(ret);
for (int i = 0; i < L1.MaxSize; i++)
{
ret = InsertElement(L1, i+1, i);
FunctionSattus(ret);
}
ret = DelElement(L1, 9);
FunctionSattus(ret);
ret = ModifyElement(L1, 3, 21);
FunctionSattus(ret);
ret = SearchEle_Order(L1, 4);
FunctionSattus(ret);
ret = SearchEle_Value(L1, 7);
FunctionSattus(ret);
return 0;
}
小结
多思考,多动手实践
PS:代码方面若有不明白的地方,可以私戳我询问,您的三连就是对我最大的支持与肯定,谢谢!