此处为线性表的基础定义和操作,方便大家一起来学习和探讨。
话不多说,直接上代码。
#include<iostream>
using namespace std;
#define InitSize 10
struct SeqList {
int* data;//数据数组
int MaxSize;//最大容量
int Length;//当前数据长度
};
void InitList(SeqList& L)//初始化
{
L.data = new int[ InitSize ];//申请一片区域,默认最大长度为10
L.MaxSize = InitSize;//默认最大容量为10
L.Length = 0;//默认当前无数据
}
void IncreaseSize(SeqList& L, int Len)//Len为需要扩充的容量大小
{
int* p = L.data;//创造一个新指针指向老数据
L.data = new int[Len+L.MaxSize];//L的指针指向扩充后的区域
for (int i = 0; i < L.Length; i++) L.data[i] = p[i];//将数据进行迁移
L.MaxSize = Len + L.MaxSize;//重新设置最大容量
delete[] p;//删除老数据区域
p = NULL;//确保指针不会乱指
}
bool IsFull(SeqList L)//判断容量是否已满
{
return L.Length == L.MaxSize;
}
bool IsEmpty(SeqList L)//判断容量是否为空
{
return L.Length == 0;
}
int RestPlace(SeqList L)//返回剩余容量
{
return L.MaxSize - L.Length;
}
int GetData(SeqList L, int i)//查找要求位置的数据并返回
{
if (IsEmpty(L))//判断数组是否为空
{
cout << "空数组,查找失败" << endl;//悲报
return;//退出
}
if (i<0 || i>L.MaxSize)//判断要求位置是否正确
{
cout << "要求位置错误,查找失败" << endl;//悲报
return;//退出
}
return L.data[i - 1];//注意数组从下标0开始存储,所以是i-1
}
int LocateData(SeqList L, int e)//查找第一个元素为e的为序
{
for (int i = 0; i < L.MaxSize; i++)//遍历数组查询
{
if (e == L.data[i])//判断元素是否相同
{
return i+1;//相同则返回对应位置
}
}
cout << "无要求元素,查找失败" << endl;//悲报
}
void ListInsert(SeqList &L,int i,int e)//插入数据
{
if (IsFull(L))//判断容量大小
{
cout << "满了,插入失败" << endl;//悲报
return;//退出
}
if (i<0 || i>L.MaxSize)//判断要求插入位置是否正确
{
cout << "插入位置错误,插入失败" << endl;//悲报
return;//退出
}
for (int j = L.MaxSize; j >= i; j--)//将指定位置之后的数据全向后移动一位
{
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;//插入数据
L.Length += 1;//当前数据个数加一
cout << "插入成功" << endl;//喜报
}
void ListDelete(SeqList& L, int i, int& e)//删除指定位置的数据并赋值给e
{
if (IsEmpty(L))//判断数组是否为空
{
cout << "空数组,删除失败" << endl;//悲报
return;//退出
}
if (i<0 || i>L.MaxSize)//判断要求删除位置是否正确
{
cout << "删除位置错误,删除失败"<<endl;//悲报
return;//退出
}
e = L.data[i - 1];//将删除的数据赋值给e
for (int j = i; j < L.MaxSize; j++) L.data[j - 1] = L.data[j];//将指定位置之后的数据向前移动一位
L.Length--;//更新数据个数
cout << "删除成功" << endl;//喜报
}
欢迎大家批评指正,我将虚心请教。