由哈希表的定义,采用C++完成了一个学生成绩存储系统,分析过程如下:

由于哈希表是按KEY值存储,我们假设KEY值为一个字符串。hash算法为字符串的前两位大写字母所对应的数字对一个质数的模运算。

int Hash(KeyType c)
{
int n = c[] - 'A'+c[]-'A'+;
return n % Mod;
}

哈希表的类定义如下

class HashTable
{
public:
// HashTable();
HashTable(int len);
~HashTable();
bool SearchHash(KeyType K, int &p, int &c,int &s);
bool InsertHash(ElemType e);
private:
ElemType * elem;
int count;
int sizeindex;
};

搜索函数SearchHash

bool HashTable::SearchHash(KeyType K, int &p, int &c,int &s)
{
c = ;
p = Hash(K);
std::string NULLKey = "None";
while (this->elem[p].key != NULLKey && K != this->elem[p].key)
{
p++;
c++;//冲突次数++
}
// cout << "after,p = " << p << endl;
if (K == this->elem[p].key)
{
s = elem[p].score;
return true;
}
else
return false;
}

插入函数InsertHash

bool HashTable::InsertHash(ElemType e)
{
int c = ;//c为冲突次数
int p,s;
if (SearchHash(e.key, p, c,s))
return false;
else if (c < Hashsize[this->sizeindex] / )
{
this->elem[p] = e;
this->count++;
return true;
}
else
{
HashTable();
return false;
}
}

任务源代码如下:

哈希表元素类

 //ElemType.h

 #ifndef ELEMTYPE_H
#define ELEMTYPE_H
#include<string>
typedef std::string KeyType;
class ElemType
{
public:
KeyType key;
int score;
};
#endif

哈希表类

 //HashTable.h

 #ifndef HASHTABLE_H
#define HASHTABLE_H
#include"ElemType.h" class HashTable
{
public:
// HashTable();
HashTable(int len);
~HashTable();
bool SearchHash(KeyType K, int &p, int &c,int &s);
bool InsertHash(ElemType e);
private:
ElemType * elem;
int count;
int sizeindex;
}; #endif

哈希表的操作函数

 //HashTable.cpp

 #include"HashTable.h"
#include<iostream>
using namespace std;
const int Mod = ;//质数模
int Hashsize[] = { ,,, };
int Hash(KeyType c)
{
int n = c[] - 'A'+c[]-'A'+;
return n % Mod;
} HashTable::HashTable(int len=)
{
elem = new ElemType[len];
for (int i = ; i < len; i++)
{
elem[i].key = "None";
}
count = ;
sizeindex = ;
} HashTable::~HashTable()
{
delete[] elem;
count = ;
sizeindex = ;
} bool HashTable::SearchHash(KeyType K, int &p, int &c,int &s)
{
c = ;
p = Hash(K);
std::string NULLKey = "None";
while (this->elem[p].key != NULLKey && K != this->elem[p].key)
{
p++;
c++;//冲突次数++
}
// cout << "after,p = " << p << endl;
if (K == this->elem[p].key)
{
s = elem[p].score;
return true;
}
else
return false;
} bool HashTable::InsertHash(ElemType e)
{
int c = ;//c为冲突次数
int p,s;
if (SearchHash(e.key, p, c,s))
return false;
else if (c < Hashsize[this->sizeindex] / )
{
this->elem[p] = e;
this->count++;
return true;
}
else
{
HashTable();
return false;
}
}

信息存储的实现

 //Main.cpp

 #include"HashTable.h"
#include<iostream>
using namespace std;
int main()
{
HashTable* H = new HashTable();
ElemType e;
int p,c;
int i=;
KeyType k;
int score;
while (i != )
{
switch (i)
{
case :
cout << "***______HashTable_____***" << endl;
cout << "***___1.Display menu___***" << endl;
cout << "***___2.Insert_________***" << endl;
cout << "***___3.Search_________***" << endl;
cout << "***___0.Exit___________***" << endl;
break;
case :
cout << "input name with A~Z: ";
cin >> k;
e.key = k;
cout << "input score with number: ";
cin >> score;
e.score = score;
H->InsertHash(e);
break;
case :
cout << "input name with A~Z: ";
cin >> k;
if (H->SearchHash(k, p, c, score))
{
cout << k << "'s score is " << score << endl;;
}
else
cout << "can't found" << endl;
break; }
cout << "输入选项:";
cin >> i;
}
system("pause");
return ;
}

效果如下

***______HashTable_____***
***___1.Display menu___***
***___2.Insert_________***
***___3.Search_________***
***___0.Exit___________***
输入选项:
input name with A~Z: DSG
input score with number:
输入选项:
input name with A~Z: QWER
input score with number:
输入选项:
input name with A~Z: DSG
DSG's score is 99
输入选项:
input name with A~Z: OOP
input score with number:
输入选项:
input name with A~Z: QWER
QWER's score is 70
输入选项:
input name with A~Z: OOP
OOP's score is 100
输入选项:
请按任意键继续. . .

HashTable的C++实现的更多相关文章

  1. HashSet HashTable 与 TreeSet

    HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...

  2. Javascript实现HashTable类

    散列算法可以尽快在数据结构中找出指定的一个值,因为可以通过Hash算法求出值的所在位置,存储和插入的时候都按照Hash算法放到指定位置. <script> function HashTab ...

  3. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  4. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

  5. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...

  6. HashTable初次体验

    用惯了数组.ArryList,初次接触到HashTable.Dictionary这种字典储存对于我来说简直就是高大上. 1.到底什么是HashTable HashTable就是哈希表,和数组一样,是一 ...

  7. HashMap和 Hashtable的比较

    Hashtable 和 HashMap的比较 1.  HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value), HashTable不可以接受为null的键( ...

  8. hashMap和hashTable的区别

    每日总结,每天进步一点点 hashMap和hashTable的区别 1.父类:hashMap=>AbstractMap hashTable=>Dictionary 2.性能:hashMap ...

  9. SortedList和HashTable

    都是集合类,C#中同属命名空间System.Collections,“用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的 ...

  10. Java Hashtable的实现

    先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...

随机推荐

  1. bzoj 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头【瞎搞】

    某种意义上真毒瘤?我没看懂题啊...于是看了题解 就是筛约数的那种方法,复杂度调和级数保证O(nlogn) 所以这题啥意思啊 #include<iostream> #include< ...

  2. spoj 287 NETADMIN - Smart Network Administrator【二分+最大流】

    在spoj上用题号找题就已经是手动二分了吧 把1作为汇点,k个要入网的向t连流量为1的边,因为最小颜色数等于最大边流量,所以对于题目所给出的边(u,v),连接(u,v,c),二分一个流量c,根据最大流 ...

  3. Zoj 1610 Count the Colors (线段树+区间更新+暴力计数)

    题目大意: 有n次操作,每次都是对一根线中的一段区间进行染色(颜色并不相同),有时候后面的颜色有可能覆盖前面的颜色,问最后涂完色,能看到的颜色有几种,每种颜色有几部分? 解题思路: 这个题目建树的时候 ...

  4. [ZPG TEST 105] 扑克游戏【Huffman】

    扑克游戏 (poker) 题目描述: 有一棵无穷大的满二叉树,根为star,其余所有点的权值为点到根的距离,如图: 现在你有一些扑克牌,点数从1到13,你要把这些扑克牌全部放到这个树上: 当你把点数为 ...

  5. BZOJ 3224 SBT 普通平衡树

    复习了一下SBT的模板,但是BZOJ不知道为什么注册不了,所以就没交,测了样例能过! #include <bits/stdc++.h> #include<algorithm> ...

  6. ACM_素数环(dfs)

    Problem Description: 如图所示,环由n个圆组成. 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数. 注意:第一个圆圈的数量应该始终为1. Input ...

  7. 支付宝添加scheme的方法

    点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“myAlipay”.“myAlipay”来自于文件“APViewControlle ...

  8. 473 Matchsticks to Square 火柴拼正方形

    还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到.输入为小女孩拥有火柴的 ...

  9. 224 Basic Calculator 基本计算器

    实现一个基本的计算器来计算一个简单的字符串表达式. 字符串表达式可以包含左括号 ( ,右括号),加号+ ,减号 -,非负整数和空格 . 假定所给的表达式语句总是正确有效的. 例如: "1 + ...

  10. 204 Count Primes 计数质数

    计算所有小于非负整数 n 的质数数量. 详见:https://leetcode.com/problems/count-primes/description/ Java实现: 埃拉托斯特尼筛法:从2开始 ...