顺序表
2. 数组
数组:是由同一种数据类型的数据元素组成的线性表,组成数组的数据元素可以是初等项,也可以是组合项。
一维的数组又称为向量,二维的数组又称为矩阵。
数组的抽象数据类型表示:
template<class T>
#define DefaultSize 100
enum boolean{FALSE,TURE};
class Array
{
private:
T *Array; //数组
int ArraySize,ArrayLength;
void GetArray(void);
public:
Array(int ArraySize=DefaultSize);
~Array(void){delete[]Array;}
int GetLength(void)const{return ArrayLength;}
//取数组中第i个结点的值,若存在,则返回该点的值。否则返回NULL。
T Getnode(int i)
{
return(i<0||i>=ArrayLength)?NULL:Array[i];
}
//查找值为x的结点,若找到,则返回序号,否则返回-1.
int Find(T&x)
{
for(int i=0;i<ArrayLength;i++)
if(Array[i]==x)return i;
return -1;
}
boolean Insert(T&x,int i);
boolean Remove(int i);
};
template<class T>
void Array<T>::GetArray(void)
{
Array=new T[ArrayLength]; //私有成员函数,动态分配数组存储空间。
if(Array==NULL)cerr<<"Memory Allocation Error"<<endl;
}
template<class T>
Array<T>::Array(int sz) //构造函数
{
if (sz<=0)
cerr<<"Invaild Array Size"endl;
else
{
ArraySize=sz;
ArrayLength=0;
GetArray();
}
}
数组元素的插入和删除:C++描述为:
template <class T>
boolean Array<T>::Insert(T&x,int i) //在数组中第i个位置插入值为x的新的元素
{ //若插入成功,则返回TRUE,否则返回FIASE.
if (ArrayLength==ArraySize)
{cerr<<"overflow"<<endl;return FALSE;} //数据存储空间已经满
else if(i<0||i>ArrayLength)
{cerr<<"position error"<<endl;return FALSE;} //插入位置错误
else
{
for(int j=ArrayLength-1;j>=i;j--)
Array[j+1]=Array[j]; //后移 ,数组长度加1
Array[i]=x;
ArrayLength++;
return TURE;
}
}
template <class T>
boolean Array<T>::Remove(int i) //删除函数
{ //删除成功则返回TRUE,否则返回FALSE。
if (ArrayLength==0)
{cerr<<"Array is empty"<<endl;return FALSE;}
else if(i<0||i>ArrayLength-1)
{cerr<<"position error"<<endl;return FALSE;}
else
{
for(int j=i;j<ArrayLength-1;j++)
Array[j]=Array[j+1]; //前移,数组长度减1
ArrayLength--;
return TURE;
}
}
数组的应用:
1.求集合的“并运算”和“交运算”。集合可以用数组来表示, 利用数组的类定义来实现所要求的运算。
“并”运算的实现:(C++ code)
template <class T>
void Union(Array<T>&Va,Array<T>&Vb) //把数组Va和Vb中的相同元素,并存入Vb
{
int n=Va.GetLength();
int m=Vb.GetLength();
for(int i=0;i<m;i++)
{
T x=Vb.Getnode(i); //从Vb中取一元素
int k=Va.Find(x); //在Va中查找相同值的元素
if(k==-1) //若找不到同值元素
{
Va.Insert(x,name);n++; //则插到Va的最后
}
}
}
“交”运算的实现:(C++ code)
template<class T>
void Intersection(Array<T>&Va,Array<T>&Vb) //求Va和Vb中的相同元素,并存入Vb
{
int n=Va.GetLength();
int m=Vb.GetLength();
int i=0;
while(i<m)
{
T x=Vb.Getnode(i); //从Vb中取一元素
int k=Va.Find(x); //在Va中查找相同值的元素
if (k== -1) //若找不到同值元素
{
Vb.Remove(i); //则从Vb中删除该元素
m--;
}
else //否则,在Vb中保留该元素
i++;
}
}
The End;