数组小练习
以数组实现的线性表的练习,包括了一些常用算法,C++实现。
#include<iostream>
#include<cstdlib> //包涵exit
using namespace std;
//定义一个数组类,包涵三个数据成员
//分别是首地址pBase,长度len,有效
//元素个数cnt
class Array
{
public:
Array(int a=10):len(a) //初始化数组(构造函数)
{
pBase=new int[a];
cnt=0;
if(NULL==pBase)
{
cout<<"动态数组申请失败!"<<endl;
exit(-1);
}
}
Array(const Array& aa); //拷贝构造函数
Array& operator=(const Array& aa); //重载赋值操作符
friend ostream& operator<<(ostream& out,const Array& aa);//重载输出操作符
friend Array operator+(const Array& aa,const Array& bb); //重载加运算符
bool is_empty()const; //判断数组是否为空
bool is_full()const; //判断数组是否满
void getlen(); //获取数组长度
void getcnt(); //获取数组有效元素个数
//void show()const; //输出数组元素
bool append(int val); //数组末尾追加元素
int get(int pos)const; //获取数组第pos个元素,无元素时返回-1
void sort(); //升序排序
bool insert(int pos ,int val); //在数组下标为pos的元素前插入一个val元素
bool remove(int pos); //删除下标为pos的元素的前一个元素
bool clear(); //清空数组
void inversion(); //倒置数组
bool replace(int pos,int val); //把下标为pos的前一个元素替换为val
bool find(int val)const; //查找元素val是否在数组中,如果在,输出它为第几个元素,没有的话提示
bool find(int a,int b,int val)const; //在区间a,b之间查找
//bool destroy(); //销毁数组
~Array();
private:
//Array(const Array& aa); //拒绝对象之间复制(拷贝构造)
int *pBase;
int cnt;
int len;
};
Array::Array(const Array& aa) //拷贝构造函数
{
pBase=new int[aa.len];
if(NULL==pBase)
{
cout<<"动态数组申请失败!"<<endl;
exit(-1);
}
len=aa.len;
cnt=aa.cnt;
if(aa.is_empty());
else
for(int i=0;i<aa.cnt;i++)
pBase[i]=aa.pBase[i];
//cout<<"拷贝构造函数被调用"<<endl;
}
Array& Array::operator=(const Array& aa) //重载赋值运算符
{
//cout<<"赋值操作符被调用。"<<endl;
if(this==&aa);
else if(aa.is_empty());
else
{
Array::~Array();
this->pBase=new int[aa.len];
if(NULL==pBase)
{
cout<<"动态数组申请失败!"<<endl;
exit(-1);
}
len=aa.len;
cnt=aa.cnt;
for(int i=0;i<aa.cnt;i++)
pBase[i]=aa.pBase[i];
}
return *this;
}
ostream& operator<<(ostream& out,const Array& aa) //重载输出运算符
{
if( aa.is_empty() )
out<<"数组为空!"<<endl;
else
{
for(int i=0;i<aa.cnt;i++)
out<<aa.pBase[i]<<" ";
out<<endl;
}
return out;
}
Array operator+(const Array& aa,const Array& bb) //重载+运算符
{
int len=aa.len+bb.len;
Array Arr(len);
for(int i=0;i<aa.cnt;i++)
Arr.append(aa.pBase[i]);
for(int i=0;i<bb.cnt;i++)
Arr.append(bb.pBase[i]);
return Arr;
}
bool Array::is_empty( )const //判断数组是否为空
{
if(cnt==0)
return true;
else
return false;
}
bool Array::is_full( )const //判断数组是否满
{
if( cnt==len )
return true;
else
return false;
}
void Array::getlen() //获取数组长度
{
cout<<"数组长度为:"<<len<<endl;
}
void Array::getcnt() //获取数组有效元素个数
{
cout<<"数组有效元素个数为:"<<cnt<<endl;
}
/*void Array:: show( )const //输出数组元素
{
if( is_empty() )
cout<<"数组为空!"<<endl;
else
{
for(int i=0;i<cnt;i++)
cout<<pBase[i]<<" ";
cout<<endl;
}
}*/
bool Array::append(int val) //数组末尾追加元素
{
if( is_full( ) )
{
cout<<"数组已满,追加失败"<<endl;
return false;
}
else
{
pBase[cnt]=val;
cnt++;
return true;
}
}
bool Array::insert(int pos ,int val) //在数组下标为pos的元素前插入一个val元素
{
if(is_full())
{
cout<<"数组已满,无法插入!"<<endl;
return false;
}
else
{
for(int i=cnt-1;i>=pos-1;i--)
pBase[i+1]=pBase[i];
pBase[pos-1]=val;
cnt++;
return true;
}
}
int Array::get(int pos)const //获取数组第pos个元素,无元素时返回-1
{
if( pos<1 || pos>=cnt+1 )
{
cout<<"无此元素!"<<endl;
return -1;
}
else
return pBase[pos-1];
}
bool Array::remove(int pos) //删除下标为pos的元素的前一个元素
{
if( is_empty() )
{
cout<<"数组为空,无法删除!"<<endl;
return false;
}
else
{
for(int i=pos;i<cnt;i++)
pBase[i-1]=pBase[i];
cnt--;
cout<<"删除第"<<pos<<"个元素成功!"<<endl;
return true;
}
}
bool Array::clear( ) //清空数组
{
if( is_empty() )
{
cout<<"数组已经为空!"<<endl;
return true;
}
else
{
for(int i=0;i<cnt;i++)
pBase[i]=NULL;
cnt=0;
return true;
}
}
bool Array::replace(int pos,int val) //把下标为pos的前一个元素替换为val
{
if(is_empty())
{
cout<<"数组为空,无法替换!"<<endl;
return false;
}
else if(pos<1||pos>cnt)
{
cout<<"数组中无此元素!"<<endl;
return false;
}
else
{
pBase[pos-1]=val;
return true;
}
}
void Array::sort() //升序排序
{
if( is_empty() )
cout<<"数组为空,无法排序!"<<endl;
else
{
for(int i=0;i<cnt;i++)
for(int j=i+1;j<cnt;j++)
{
if(pBase[i]>pBase[j])
{
int t;
t=pBase[i];
pBase[i]=pBase[j];
pBase[j]=t;
}
}
}
}
void Array::inversion() //倒置数组
{
if(is_empty())
cout<<"数组为空,无法倒置!"<<endl;
else
{
int i=0;int j=cnt-1;
while(i<j)
{
int t;
t=pBase[i];
pBase[i]=pBase[j];
pBase[j]=t;
i++;
j--;
}
}
}
bool Array:: find(int val)const //查找数组中是否有val元素
{
if( is_empty() )
{
cout<<"数组为空!不存在此元素!!"<<endl;
return false;
}
else
{
int aa=0;
for(int i=0;i<cnt;i++)
{
if( pBase[i]==val )
{
cout<<i+1<<"\t";
aa++;
}
}
if(aa==0)
cout<<"数组中无此元素"<<endl;
else
cout<<endl;
return true;
}
}
bool Array::find(int a,int b,int val)const //在数组第a到第b个元素中查找是否有val元素
{
if(a>b||a<0||a>=cnt||b>=cnt)
{
cout<<"数组为空或者查找范围出错。"<<endl;
return false;
}
else
{
int aa=0;
for(int i=a-1;i<b;i++)
{
if( pBase[i]==val )
{
cout<<i+1<<"\t";
aa++;
}
}
if(aa==0)
cout<<"无此元素"<<endl;
else
cout<<endl;
return true;
}
}
Array::~Array() //析构函数
{
delete []pBase;
//cout<<"析构函数被调用。"<<endl;
}
int main()
{
Array arr;
cout<<arr;
arr.append(10);
arr.append(2);
arr.append(3333);
arr.append(44);
arr.append(55);
arr.append(6);
cout<<"追加六个元素后为:"<<endl;
cout<<arr;
arr.insert(3,33);
arr.insert(4,44);
cout<<"插入后"<<endl;
cout<<arr;
cout<<"拷贝后为:"<<endl;
Array arra(arr);
cout<<arra;
arr.sort();
Array array;
array=arra;
cout<<"赋值:"<<endl;
cout<<array;
cout<<"排序后"<<endl;
cout<<arr;
cout<<"获取第5个元素为"<<endl;
cout<<arr.get(5)<<endl;
arr.remove(3);
cout<<"删除后为:"<<endl;
cout<<arr;
arr.inversion();
cout<<"倒置后为:"<<endl;
cout<<arr;
arr.replace(3,333);
cout<<"把第三个元素替换为333后为:"<<endl;
cout<<arr;
Array Arr;
Arr=arr+array;
cout<<"两个数组相加后:"<<endl;
cout<<Arr;
cout<<"重新排序后为:"<<endl;
Arr.sort();
cout<<Arr;
cout<<"查找数组中是否有44的元素。"<<endl;
Arr.find(44);
cout<<"查找数组中是否有888的元素。"<<endl;
Arr.find(888);
cout<<"在数组中第一到第十个元素中查找是否有33的元素。"<<endl;
Arr.find(1,10,33);
cout<<"在数组中第一到第十个元素中查找是否有666的元素。"<<endl;
Arr.find(1,10,666);
arr.clear();
cout<<"清空数组后为:"<<endl;
cout<<arr;
return 0;
}