C++顺序表的构建(用数组存储数据)
2017-08-20 20:46
351 查看
这是最简单的顺序表,顺序表中的元素都存储在数组T *data中
const int defaultSize = 100;
template <class T>
class LinearList
{
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);//改变数组的大小
public:
LinearList(int sz = defaultSize);
LinearList(LinearList<T> &L);
~LinearList()
{
delete[]data;
}
int Size()const
{
return maxSize;
}
int Length()const
{
return last + 1;
}
int Search(T &x)const;
int Locate(int i)const;
bool getData(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x = data[i + 1];
return true;
}
else return false;
}
void setData(int i, T &x)const
{
if(i > 0 && i <= last + 1) data[i - 1] = x;
}
bool Insert(int i, T &x)const;
bool Remove(int i, T &x)const;
bool IsEmpty(){return (last==-1) ? true : false;}
bool IsFull(){return (last+1==maxSize) ? true : false;}
void input();
void output();
LinearList<T> operator=(LinearList<T> &L);
};
//构造函数
template<class T>
LinearList<T>::LinearList(int sz){
if(sz>0){
data=new T[sz];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
last=-1;
maxSize=sz;
}
}
//复制构造函数
template<class T>
LinearList<T>::LinearList(LinearList<T> &L){
maxSize=L.Size();
last=L.Length()-1;
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
T value;
for(int i=0; i<=last;i++){
L.getData(i+1, value);//从中获取值
data[i]=value;
}
}
template<class T>
void LinearList<T>::reSize(int newSize){
if(newSize<=last+1){ cerr<<"数组空间太小!"<<endl; return;}
if(newSize!=maxSize){
T *arr=new T[newSize];
if(arr==NULL){ cerr<<"内存分配失败!"; exit(1);}
maxSize=newSize;
for(int i=0; i<=last;i++){
arr[i]=data[i];
}
delete []data;
data=arr;
}
}
template<class T>
int LinearList<T>::Search(T &x)const{
for(int i=0; i<=last;i++){
if(data[i]==x)return i+1;
}
return -1;//搜索失败
}
//确定这个位置是否有数
template<class T>
int LinearList<T>::Locate(int i)const{
if(i<=0||i>last+1)return -1;
else return i;
}
template<class T>
void LinearList<T>::input(){
int num;
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1){
cin>>num;
if(num>0&&num<=maxSize)break;
cout<<"您输入的数字太小或太大,要大于0并且小于等于"<<maxSize<<endl;
}
last=num-1;
for(int i=0;i<=last;i++){
cout<<"输入第"<<i+1<<"个元素:"<<endl; cin>>data[i];
}
}
template<class T>
void LinearList<T>::output(){
cout<<"顺序表当前元素最后的位置last为:"<<last<<endl;
for(int i=0;i<=last;i++)cout<<"第"<<i+1<<"个元素为:"<<data[i]<<endl;
}
template<class T>
bool LinearList<T>::Remove(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x=data[i-1];
for(int j = i - 1; j<=last-1; j++)
data[j] = data[j + 1];
return true;
}
else return false;
}
template<class T>
bool LinearList<T>:: Insert(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
for(int j = last+1 ; j >=i; j--)
{
data[j] = data[j-1];
}
data[i - 1] = x;
return true;
}
else return false;
}
//其实和上面复制构造函数是一致的
template<class T>
LinearList<T> LinearList<T>::operator=(LinearList<T>& L){
maxSize=L.Size();
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败"<<endl; exit(1);}
last=L.Length()-1;
T value;
for(int i=0;i<=last;i++){
L.getData(i+1,value);
data[i]=value;
}
}
const int defaultSize = 100;
template <class T>
class LinearList
{
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);//改变数组的大小
public:
LinearList(int sz = defaultSize);
LinearList(LinearList<T> &L);
~LinearList()
{
delete[]data;
}
int Size()const
{
return maxSize;
}
int Length()const
{
return last + 1;
}
int Search(T &x)const;
int Locate(int i)const;
bool getData(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x = data[i + 1];
return true;
}
else return false;
}
void setData(int i, T &x)const
{
if(i > 0 && i <= last + 1) data[i - 1] = x;
}
bool Insert(int i, T &x)const;
bool Remove(int i, T &x)const;
bool IsEmpty(){return (last==-1) ? true : false;}
bool IsFull(){return (last+1==maxSize) ? true : false;}
void input();
void output();
LinearList<T> operator=(LinearList<T> &L);
};
//构造函数
template<class T>
LinearList<T>::LinearList(int sz){
if(sz>0){
data=new T[sz];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
last=-1;
maxSize=sz;
}
}
//复制构造函数
template<class T>
LinearList<T>::LinearList(LinearList<T> &L){
maxSize=L.Size();
last=L.Length()-1;
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败!"; exit(1);}
T value;
for(int i=0; i<=last;i++){
L.getData(i+1, value);//从中获取值
data[i]=value;
}
}
template<class T>
void LinearList<T>::reSize(int newSize){
if(newSize<=last+1){ cerr<<"数组空间太小!"<<endl; return;}
if(newSize!=maxSize){
T *arr=new T[newSize];
if(arr==NULL){ cerr<<"内存分配失败!"; exit(1);}
maxSize=newSize;
for(int i=0; i<=last;i++){
arr[i]=data[i];
}
delete []data;
data=arr;
}
}
template<class T>
int LinearList<T>::Search(T &x)const{
for(int i=0; i<=last;i++){
if(data[i]==x)return i+1;
}
return -1;//搜索失败
}
//确定这个位置是否有数
template<class T>
int LinearList<T>::Locate(int i)const{
if(i<=0||i>last+1)return -1;
else return i;
}
template<class T>
void LinearList<T>::input(){
int num;
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1){
cin>>num;
if(num>0&&num<=maxSize)break;
cout<<"您输入的数字太小或太大,要大于0并且小于等于"<<maxSize<<endl;
}
last=num-1;
for(int i=0;i<=last;i++){
cout<<"输入第"<<i+1<<"个元素:"<<endl; cin>>data[i];
}
}
template<class T>
void LinearList<T>::output(){
cout<<"顺序表当前元素最后的位置last为:"<<last<<endl;
for(int i=0;i<=last;i++)cout<<"第"<<i+1<<"个元素为:"<<data[i]<<endl;
}
template<class T>
bool LinearList<T>::Remove(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
x=data[i-1];
for(int j = i - 1; j<=last-1; j++)
data[j] = data[j + 1];
return true;
}
else return false;
}
template<class T>
bool LinearList<T>:: Insert(int i, T &x)const
{
if(i > 0 && i <= last + 1)
{
for(int j = last+1 ; j >=i; j--)
{
data[j] = data[j-1];
}
data[i - 1] = x;
return true;
}
else return false;
}
//其实和上面复制构造函数是一致的
template<class T>
LinearList<T> LinearList<T>::operator=(LinearList<T>& L){
maxSize=L.Size();
data=new T[maxSize];
if(data==NULL){cerr<<"内存分配失败"<<endl; exit(1);}
last=L.Length()-1;
T value;
for(int i=0;i<=last;i++){
L.getData(i+1,value);
data[i]=value;
}
}
相关文章推荐
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 用不同的方法将⼀个数组中的数据按相反的顺序存储
- 数据结构之线性表——链表的顺序存储(数组描述)
- 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决
- 数组的顺序存储表示和实现-数据结构
- 数据结构之线性结构的顺序存储(数组)
- 数据结构之顺序栈(数组)C++(模板)
- 数据结构之线性表——链表的顺序存储(数组描述)
- 使用数组构建线性表的顺序表数据结构
- 【数据结构之线性表顺序存储】简单的数组的方式实现
- 将一个数组中的数据按相反的顺序存储(将数组中的数据逆序输出)
- 数据结构课程设计-通讯录管理系统c++版(顺序表存储,折半查找,递增排序)
- c/c++常用算法(1) -- 数据结构(线性表的顺序存储)
- 数据结构之循环队列(顺序表存储)——C++模板类实现
- 将一个数组中数据按相反的顺序存储
- c++ hash_set 删除原数组重复数据,且不改变原数组顺序
- 再回首,数据结构——字符串与数组的常见操作(顺序存储)
- C/C++ 数据结构---线性顺序存储数据:查询快,增删慢
- iOS数据库存储数组或字典等数据
- 数据结构课程设计--数组(顺序实现)