数据结构——数组
(一)数组
1.1 数组的存储和寻址
1.一个一维数组就是若干元素的一个有限序列,而其每个元素都通过下标来指定,且元素本身就是一种数据结构。
2.一维数组唯一的限制就是所有的元素都具有相同的类型,并占据相同大小的存储空间。
3.高维数组:按行优先顺序和按列优先顺序。
(1)按行优先顺序
二维数组A[m][n]中任意元素A[i][j]的存储地址: Loc(A[i][j])=Loc(A[0][0])+(i*n+j)*C
三维数组A[m][n][p]中数组元素a[i][j][k]地址计算公式为: Loc(a[i][j][k])=Loc(a[0][0] [0])+i*n*p*C+j*p*C+k*C
n维数组a[i1][i2]…[in]的存储地址:
1.2 自定义数组类:
在自定义的数组类中,不但需要重载一些必要的运算符,还需要对下标符号“[ ]”进行重载,以确保可提供越界索引保护。
一维数组Array的定义:
template <class T>
class Array
{ private:
int FSize; // 数组的大小
T* alist; // 指向数组的第一个元素的指针
void Allocate( ); // 为数组分配空间
public:
Array( int sz=50 );
Array( const Array <T>& x ); //复制构造函数 ~Array( void ) { delete[ ] alist;}
Array<T>& operator=(const Array<T>& x);
T& operator[ ](int i);
Array<T> Operator T*(void)const
{return alist;}
int ListSize(void) const
{ return Fsize;}
void Resize(int NewSize);
};
Array的实现:
Template<class T> // 为数组分配空间
Void Array<T>∷Allocate( )
{
alist = new T[Fsize];
if( alist==0 )
cerr<<“Memory Allocation Fail.”<<endl;
}
Template<class T> // 构造函数
Array<T>∷Array(int sz=50)
{
if(sz<=0)
{
cerr<<“Invalid Array Size.”<<endl;
return;
}
Fsize=sz;
Allocate( );
}
template <class T>//复制构造函数
Array<T>∷Array(const Array<T>& x )
{
Fsize=x.Fsize;
Allocate( );
for(int i=0; i< Fsize; i++)
alist[i] = x.alist[i];
}
template<class T> // [ ]的重载
T& Array<T>∷operator[ ](int i)
{
if( i<0 || i>=Fsize )
{
cerr<<“invalid index.”<<;
endl;
exit(1);
}
return alist[i];
}
template <class T> // 修改数组的大小
void Array<T>∷ReSize(int newSize)
{
if (newSize <= 0)
{ cerr<<“invalid Array Size.”<<endl;
return;}
if(newSize != Fsize)
{ newArray = new T[newSize];
if(newArray==0)
{ cerr<<“Memory Allocation Fail.” <<endl;
return;}
int n=(newSize <= Fsize?newSsize:Fsize);
for(int i=0;i<n;i++)
newArray[i]=alist[i];
delete[ ]alist;
alist=newArray;
FSize=newSize;
}
}