哈希表——直接定址法

“test.cpp”

#include
using namespace std;
#include

enum Status
{
	EMPTY,
	EXIST,
	DELETE,
};

template
struct HashTableNode
{
	K _key;
	V _value;
	Status _status;

	HashTableNode(const K& key = K(),const V& value = V())
		:_key(key)
		,_value(value)
		,_status(EMPTY)
	{}
};

template
class HashTable
{
	typedef HashTableNode Node;
public:
	HashTable()
		:_size(0)
	{
		_table.resize(0);
		//_table.resize(_GetNextPrime(0));
	}

	bool Insert(const K& key,const V& value)
	{
		//检查负载因子,查看是否需要扩容
		_Check();
		int index = _HashFunc(key);
		
		while(_table[index]._status != EMPTY)
		{
			++index;
			if(index == _table.size())
			{
				index = 0;
			}		
		}

		_table[index]._key = key;
		_table[index]._value = value;
		_table[index]._status = EXIST;
		_size++;
	}
	Node* Find(const K& key)
	{
		size_t index = _HashFunc(key);
		//记录第一次查找的下标
		size_t src = index;

		while(_table[index]._status != EMPTY)
		{
			if(_table[index]._key == key)
			{
				if(_table[index]._status != DELETE)
					return &_table[index];
				else
					return NULL;
			}
			++index;

			if(index == _table.size())
				index = 0;
			
			//避免死循环操作
			if(index == src)
				return NULL;
		}

		return NULL;
	}

	bool Remove(const K& key)
	{
		Node* ret = Find(key);

		if(ret)
		{
			ret->_status = DELETE;
			--_size;
			return true;
		}

		return false;
	}

	void Display()
	{
		for(int i = 0;i < _table.size();i++)
		{
			if(_table[i]._status == DELETE)
				_table[i]._key = 0;

			cout<<"["<

你可能感兴趣的:(数据结构,数据结构)