题目

散列表

解决代码及点评

#include <iostream>
#include <time.h>
using namespace std;

template <class T>
class HashTable
{
private:
	T *pArr;
	int nSize;
	T EMPTY;	//为空
	T TOMB;		//墓碑
	int nCount;
	int hFun(T key)	//散列函数
	{
		return key % nSize;
	}
	int hDoubleFun(T key)	//双散列函数
	{
		int h1 = key % nSize;
		int h2 = key % nSize + 1;
		return (h1 + h2) % nSize;
	}

	int p(T key, int i)    //探查函数
	{
		return i;
	}

public:
	HashTable(int count, T empty, T tomb);
	~HashTable(){ delete pArr; }
	bool HashInsert(T value);
	bool HashSearch(T value);
	T HashDelete(const T value);
	int Count(){  return nCount; }
};

template<class T>
HashTable<T>::HashTable(int size, T empty, T tomb)
{
	nSize = size;
	pArr = new T[nSize];
	nCount = 0;
	EMPTY = empty;
	TOMB = tomb;

	for (int i = 0; i < nSize; i++)
	{
		pArr[i] = EMPTY;
	}
}

template<class T>
bool HashTable<T>::HashInsert(T value)
{
	int key = hFun(value);
	int nPos = key;
	int FirstTombPos;
	bool tombPos = false;
	int i = 0;

	while(pArr[nPos] != EMPTY)
	{
		if (pArr[nPos] == value)
		{
			return false;
		}
		if (pArr[nPos] == TOMB && tombPos == false)
		{
			FirstTombPos = nPos;
			tombPos = true;
		}
		i++;
		nPos = (key + p(key, i)) % nSize;
	}

	if (tombPos == false)
	{//遇到探查序列的尾部空槽, 可以插入新元素 (没有遇到墓碑)
		pArr[nPos] = value;
	}
	else
	{
		pArr[FirstTombPos] = value;
	}
	return true;
}

template<class T>
bool HashTable<T>::HashSearch(T value)
{
	int key = hFun(value);
	int nPos = key;
	int i = 0;
	while(pArr[nPos] != EMPTY)
	{
		if(pArr[nPos] == value)
		{
			return true;
		}
		i++;
		nPos = (key + p(value,i)) % nSize;
	}

	return false;
}

template<class T>
T HashTable<T>::HashDelete(T value)
{
	int key = hFun(value);
	int nPos = key;
	int i = 0;

	while(pArr[nPos] != EMPTY)
	{
		if (pArr[nPos] == value)
		{//找到要删除的元素 设置墓碑
			int nTmp = pArr[nPos];
			pArr[nPos] = TOMB;
			return nTmp;
		}
		i++;
		nPos = (key + p(value, i)) % nSize;
	}

	return EMPTY;
}
int main()
{
	HashTable<int> hashTable(11, -1, -2);
	srand(time(NULL));
	for (int i = 0; i < 10; i++)
	{
		int nTmp = rand()%100 + 1;
		cout<<nTmp<<" ";
		hashTable.HashInsert(nTmp);
	}

	int nSearch;
	cin>>nSearch;
	cout<<hashTable.HashSearch(nSearch)<<endl;
	int nDel;
	cin>>nDel;
	hashTable.HashDelete(nDel);
	cout<<hashTable.HashSearch(nDel)<<endl;

	system("pause");
	return 0;
}

代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6858815

解压密码:c.itcast.cn

下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”

2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行

程序运行结果






基于visual Studio2013解决算法导论之028散列表开放寻址的更多相关文章

  1. 基于visual Studio2013解决算法导论之044最短路径

     题目 最短路径 解决代码及点评 // 26最短路径dijstra.cpp : 定义控制台应用程序的入口点. // #include <iostream> using namespa ...

  2. 基于visual Studio2013解决算法导论之023队列实现(基于数组)

     题目 基于数组的队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...

  3. 基于visual Studio2013解决算法导论之022队列实现(基于链表)

     题目 基于链表的队列实现 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  4. 基于visual Studio2013解决算法导论之055拓扑排序

     题目 拓扑排序 解决代码及点评 // 拓扑排序.cpp : 定义控制台应用程序的入口点. // // 深度优先.cpp : 定义控制台应用程序的入口点. // // 图的邻接表表示.cpp : ...

  5. 基于visual Studio2013解决算法导论之054图的邻接矩阵表示

     题目 图的邻接矩阵表示 解决代码及点评 // 图的邻接矩阵表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <l ...

  6. 基于visual Studio2013解决算法导论之053图的邻接表表示

     题目 图的邻接表表示 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <sta ...

  7. 基于visual Studio2013解决算法导论之052深度优先

     题目 深度优先 解决代码及点评 // 深度优先.cpp : 定义控制台应用程序的入口点. // // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include < ...

  8. 基于visual Studio2013解决算法导论之051区间树

     题目 区间树 解决代码及点评 #include <stdio.h> #include <string.h> #include <iostream> #def ...

  9. 基于visual Studio2013解决算法导论之050强连通分支

     题目 强连通分支 解决代码及点评 // 强连通分支.cpp : 定义控制台应用程序的入口点. // #include<iostream> #define MAX 100 using ...

随机推荐

  1. Spring MVC 学习总结(三)——请求处理方法Action详解

    Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action,每个请求处理方法可以有多个不同的参数,以及一个多种类型的返回结果. 一.Action参数类型 如果 ...

  2. 超级链接a中javascript:void(0)弹出另外一个框问题

    转字:http://my.oschina.net/castusz/blog/68186 结果在IE.Firefox.Chrome都是先执行的onclick事件,在项目中我们尽量不要同时使用这两种方式. ...

  3. TinyFrame框架中的UOW使用方式纠正

    我自己的框架中,UOW是可以通过反射提取具体的Repository的,也可以调用Commit方法. 但是正确的应用方式应该是: Using(var uow = new UnitOfWork()) { ...

  4. Summary of java stream classes

    Java’s stream classes are good for streaming sequences of bytes, but they’re not good for streaming ...

  5. 出错处理完美搭配之perror&amp;exit

    对于库函数出错处理有两个十分有用的函数perror和exit: 一.错误报告 perror函数用一种简单统一的方式报告错误.ANSI C中的许多库函数,尤其是I/O函数,会调用操作系统去执行一些工作. ...

  6. javascript函数没有重载测试

    今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会.哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去.虽然路途艰辛 ...

  7. C++内存管理(超长,例子很详细,排版很好)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  8. python3-day4(re正则表达式,冒泡)

    一.正则表达式常用 1.re.match:只尝试从字符串的查找,后面不作查找. 例子: import re text="aabcdefg123123" m=re.match('a' ...

  9. c#二进制、十进制、16进制之间的转换

    //十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...

  10. Treap初步

    模板题 bzoj3224: Tyvj 1728 普通平衡树 #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...