Hash线性探测法C++实现

#include <iostream>
#include <iomanip>
#define DefaultSize 10

using namespace std;

enum KindOfStatus{Active,Empty,Deleted};
template<typename T>
class HashTable
{
public:
		HashTable(int d,int sz=DefaultSize)
		{
			_D = d;
			TableSize=sz;
			CurrentSize=0;
			_A = new T[TableSize];
			info = new KindOfStatus[TableSize];
			for(int _I=0;_I<TableSize;_I++)
			{
				info[_I]=Empty;
			}
		}
		HashTable(const HashTable& ht)
		{
			_D=ht._D;
			TableSize=ht.TableSize;	
			CurrentSize=ht.CurrentSize;	
			_A=new T[TableSize];
			info = new KindOfStatus[TableSize];
			for(int _I=0;_I<TableSize;_I++)
			{
				info[_I]=ht.info[_I];
				_A[_I] = ht._A[_I];
			}
		}
		HashTable& operator=(const HashTable& ht)
		{	
			if(this!=&ht)
			{
				if(_A!=NULL && info!=NULL)
					{
						delete []_A;
						delete []info;
						_D=ht._D;
						TableSize=ht.TableSize;
						CurrentSize=ht.CurrentSize;
						_A=new T[TableSize];
						info = new KindOfStatus[TableSize];
						for(int _I=0;_I<TableSize;_I++)
						{
							info[_I]=ht.info[_I];
							_A[_I] = ht._A[_I];
						}
					}
			}
		}	
	 bool operator!=(const HashTable& ht)
		{
			if(_D!=ht._D || TableSize!=ht.TableSize || CurrentSize!=ht.CurrentSize)
			{
				return false;
			}
			for(int _I=0;_I<TableSize;_I++)
			{
				if(info[_I]!=ht.info[_I] || _A[_I]!=ht._A[_I])
				return false;
			}
			return true;
		}
int Hash(int x)
	{
		int dex = x%_D;
		int _I=dex;
		if(info[_I]==Empty || info[_I]==Deleted)
			return _I;
	  do
		{
			if(info[_I]==Active && _A[_I]!=x)
				_I=(_I+1)%TableSize;
			if(info[_I]==Empty || (info[_I]==Active && _A[_I]==x) || info[_I]==Deleted)
				return _I;
		}while(_I!=dex);
		return _I;
	}
int FindPos(int x)
{
	int dex = x%_D;
	int _I=dex;
	do
	{
		if(info[_I]==Active && _A[_I]==x)
		{
#ifdef _YES
			cout<<"找到该元素,它的位置是:"<<(_I)%TableSize+1<<endl;
#endif
			return _I;
		}
		_I=(_I+1)%TableSize;
	}while(dex!=_I);
	if(dex==_I)
		{cout<<"没有找到该元素"<<endl;return -1;};
}
void Insert(int x)
	{
			int dex=Hash(x);
			if(info[dex]==Active && _A[dex]==x)
			{cout<<"已经存在的值,不能插入!!"<<endl;return ;}
			if(info[dex]==Active && dex==(x%TableSize))
			{cout<<"表满!!"<<endl;return ;}
			if(info[dex]==Empty || info[dex]==Deleted)
				_A[dex] = x;
				info[dex]=Active;
				CurrentSize++;
	}
	~HashTable()
	{
		delete []_A;
		delete []info;
		for(int _I=0;_I<TableSize;_I++)
		{
			info[_I]=Empty;
		}
	}
void Show()
	{
		cout<<"状态:";
		for(int _I=0;_I<TableSize;_I++)
		{
			cout<<setw(4)<<info[_I];
		}
		cout<<endl;
		cout<<"内容:";
		for(int _J=0;_J<TableSize;_J++)
		{
			cout<<setw(4)<<_A[_J];
		}
		cout<<endl;
  }
void Remove(int x)
	{
		int dex = FindPos(x)-1;
		info[dex]=Deleted;
		_A[dex]=0;
	} 
	private:
	int _D;
	int CurrentSize;
	int TableSize;
	KindOfStatus *info;
	T *_A;
};

int main()
{
	HashTable<int> ht(7,10);
	ht.Insert(1);
	ht.Insert(8);
	ht.Insert(15);
	ht.Insert(22);
	ht.Insert(29);
	ht.Insert(36);
	ht.Insert(43);
	ht.Insert(50);
	ht.Insert(57);
	ht.Insert(64);
	HashTable<int> hz(ht);
	hz.Remove(8);
	hz.Show();
	return 0;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。