数据结构基础知识(三)

顺序表

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;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值