一、思维导图
二、使用C++手动封装一个顺序表,包含成员数组一个
cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <csignal>
using namespace std;
using datatype = int;
#define MAX 30
struct Seqlist
{
private:
// datatype data[MAX] = {0}; //顺序表的数组
datatype *data; //顺序表的数组
int size = 0; //数组的大小
int len = 0; //顺序表实际长度
public:
//初始化函数
void init(int n);
//判空函数
bool empty();
//判满函数
bool full();
//添加数据函数
bool add(datatype element);
//求当前顺序表的实际长度
int seq_length();
//任意位置插入函数
bool insert_pos(int pos, datatype element);
//任意位置函数函数
bool delete_pos(int pos);
//访问容器中任意一个元素 at
datatype &at(int index);
//遍历展示顺序表
bool list_show();
//二倍扩容
void expend();
//销毁
void destroy();
};
//结构体函数定义
void Seqlist::init(int n)
{
size = n; //当前数组的最大容量
data = new datatype[size]; //在堆区申请一个顺序表容器
}
bool Seqlist::empty()
{
return len==0?1:0;
}
bool Seqlist::full()
{
return len==size?1:0;
}
bool Seqlist::add(datatype element)
{
//判满
bool res = full();
if(res == 1)
{
expend();
}
data[len] = element;
len++;
cout<<"size ="<<size<<endl;
return 1;
}
int Seqlist::seq_length()
{
return len;
}
bool Seqlist::insert_pos(int pos, datatype element)
{
//判满
bool res = full();
if(res == 1)
{
expend();
}
//判断pos合法性
if(pos<0 || pos>len)
{
cout<<"插入位置错误"<<endl;
return 0;
}
//插入位置所有元素后移
for(int i=len-1;i>len-pos;i--)
{
data[i+1] = data[i];
}
// 插入新元素
data[pos] = element;
// 更新长度
len++;
return 1;
}
datatype& Seqlist::at(int index)
{
//判断位置合法
if(index<0 || index>=len)
{
cout<<"访问位置错误,返回默认位置"<<endl;
return data[0];
}
return data[index];
}
bool Seqlist::list_show()
{
//判断表空
if(len == 0)
{
cout<<"empty"<<endl;
return 0;
}
for(int i=0;i<len;i++)
{
cout<<data[i]<<"\t";
}
cout<<endl;
return 1;
}
void Seqlist::expend()
{
//申请二倍空间
datatype* temp =new datatype[size*2];
//将原顺序表拷贝到新顺序表
memcpy(temp,data,size* sizeof(datatype));
delete[] data; //销毁原顺序表
data = temp; //data重新指向新顺序表
size *= 2;
}
void Seqlist::destroy()
{
delete[] data;
size = 0;
len = 0;
data = NULL;
}
int main()
{
cout<<"***********顺序表***********"<<endl;
cout<<" 1、创建顺序表 "<<endl;
cout<<" 2、初始化顺序表 "<<endl;
cout<<" 3、任意位置插入 "<<endl;
cout<<" 4、打印顺序表 "<<endl;
cout<<" 5、打印任意位置 "<<endl;
cout<<" 6、销毁顺序表 "<<endl;
//实例化一个顺序表
Seqlist list;
while(1)
{
//system("cls"); //清屏
int menu = 0;
cout<<"请输入操作选项:";
cin>>menu;
switch(menu)
{
case 1:
{
cout<<"创建顺序表"<<endl;
int size = 0;
cout<<"请输入需要创建顺序表的大小"<<endl;
cin>>size;
list.init(size);
cout<<"创建成功"<<endl;
}
break;
case 2:
{
cout<<"初始化顺序表"<<endl;
int n = 0;
cout<<"请输入您要插入数据个数"<<endl;
cin>>n;
datatype element = 0;
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个数据"<<endl;
cin>>element;
list.add(element);
}
cout<<"初始化成功"<<endl;
}
break;
case 3:
{
cout<<"任意位置插入"<<endl;
int pos = 0;
datatype element;
cout<<"请输入您要插入的位置"<<endl;
cin>>pos;
cout<<"请输入您要插入的元素"<<endl;
cin>>element;
bool res = list.insert_pos(pos,element);
if(res == 1)
{
cout<<"任意位置插入成功"<<endl;
}
}
break;
case 4:
{
cout<<"打印顺序表"<<endl;
//输出
list.list_show();
}
break;
case 5:
{
cout<<"打印任意位置"<<endl;
int pos = 0;
cout<<"请输入您要查看的位置:";
cin>>pos;
cout<<list.at(pos-1)<<endl;
}
break;
case 6:
{
cout<<"销毁顺序表"<<endl;
list.destroy();
cout<<"销毁成功"<<endl;
}
break;
default:
cout<<"选项输入错误"<<endl;
}
}
return 0;
}