`
20386053
  • 浏览: 461383 次
文章分类
社区版块
存档分类
最新评论

哈希表实现

 
阅读更多
本文转自:哈希表的实现
相关定义:根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表(或称哈希表),这一映象过程称为散列造表或散列,所得的存储位置称散列地址
构造哈希函数的方法: 

1. 直接寻址法

2. 数字分析法

3. 平方取中法

4. 折叠法

5. 随机数法

6. 除留余数法

处理冲突的方法:

1. 开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为

增量序列,可有下列三种取法:

1.1. di=1,2,3,…,m-1,称线性探测再散列;

1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)称二次探测再散列;

1.3. di=伪随机数序列,称伪随机探测再散列。

2. 再散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间

3. 链地址法

4. 建立一个公共溢出区

代码:

// HashTable.cpp : 定义控制台应用程序的入口点
//哈希表的实现  
//哈希函数采用除留余数法构造  
//使用链地址法解决冲突  
  
#include "stdafx.h"  
#include <iostream>  
using namespace std;  
  
const int MAXSIZE = 100;   
int a[MAXSIZE];  
  
//哈希表的结点类型  
class HashNode  
{  
public:  
    HashNode():next(NULL){};//默认构造函数  
    HashNode(int item):data(item), next(NULL){};//一般构造函数  
  
private:  
    int data;  
    HashNode *next;  
    friend class HashTable;  
};  
  
//哈希表类型  
class HashTable  
{  
public:  
    HashTable();  
    void Create(int *a, int n);//创建哈希表  
    bool Find(int data);//查找  
    void Insert(int data);//插入  
    void Delete(int data);//删除  
  
private:      
    HashNode *value[10];//哈希表长度为10  
};  
  
HashTable::HashTable()//默认构造函数  
{     
    memset(value, NULL, 10*sizeof(HashNode*));  
}  
  
void HashTable::Create(int *a, int n)  
{  
    cout << "请输入n个元素:" << endl;  
    for (int i=0; i<n; i++)  
    {  
        cin >> a[i];  
        Insert(a[i]);  
    }  
}  
  
bool HashTable::Find(int data)  
{  
    HashNode *pNode = NULL;  
  
    if (value[data%10] == NULL)//该结点不存在,则返回false  
    {         
        return false;  
    }  
  
    pNode = value[data%10];//获取所在位置对应的链表的第一个结点  
    while(pNode ->next != NULL && pNode->data != data)  
    {  
        pNode = pNode->next;  
    }  
  
    if (pNode != NULL)  
    {         
        return true;  
    }  
    else   
    {          
        return false;  
    }  
}  
  
void HashTable::Insert(int data)  
{  
    HashNode *pNode = NULL;  
  
    if (value[data%10] == NULL)//获取所在位置对应的链表为空,则插入  
    {  
        pNode = new HashNode;  
        pNode->data = data;  
        value[data%10] = pNode;  
    }  
    else//所在位置对应的链表不空  
    {  
        if (Find(data))//检查该数值是否已经存在,若存在则返回  
        {  
            return;  
        }  
        else//否则插入链表尾端  
        {  
            pNode = value[data%10];  
            while(pNode->next != NULL)  
            {  
                pNode = pNode->next;  
            }  
  
            HashNode *newNode = new HashNode(data);               
            pNode->next = newNode;  
        }         
    }  
}  
  
void HashTable::Delete(int data)  
{  
    HashNode *pNode = NULL;//定位到待删除的结点  
    HashNode *pPre = NULL;//定位到待删除结点的前一个结点    
  
    if (!Find(data))  
    {  
        cout << "该数值的结点不存在!" << endl;  
    }  
    else  
    {  
        pNode = value[data%10];//初始值为所在位置对应的链表的第一个结点          
        if(pNode->data == data)//头结点即为待删除的结点  
        {  
            value[data%10] = pNode->next;  
            cout << data << "删除成功!" << endl;  
        }  
        else//否则指针后移,找到待删除的结点  
        {     
            pPre = pNode;  
            while(pNode->next != NULL && pNode->next->data != data)  
            {  
                pPre = pNode;  
                pNode = pNode->next;               
            }  
            pPre->next = pNode->next;  
            delete pNode;  
            pNode = NULL;  
            cout << data << "删除成功!" << endl;  
        }     
    }     
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{     
    int n = 0;  
    cout << "请输入哈希表元素的个数:";  
    cin >> n;  
      
    HashTable *ht = new HashTable;  
    ht->Create(a, n);      
  
    cout << ht->Find(9) << endl;  
    cout << ht->Find(3) << endl;  
  
    ht->Delete(10);  
    ht->Delete(8);  
  
    cout << ht->Find(8) << endl;  
  
    system("pause");  
    return 0;  
}  


分享到:
评论

相关推荐

    《数据结构课程设计》设计哈希表实现电话号码查找系统

    问题描述: 设计哈希表实现电话号码查找系统。 基本要求: (1)设每个记录有下列数据项:电话号码、用户名、地址; (2)从文件中读取各记录,分别以电话号码和用户名为关键字建立不同的哈希表; (3)采用链地址法...

    哈希表应用 设计哈希表实现图书查找系统,完成相应的建表和查表程序。c语言课设

    设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 (1)记录由外部输入。 (2)生成的哈希...

    C语言设计哈希表实现图书查找

    C语言设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 1) 记录由外部输入。 2) 将生成...

    c + + 哈希表实现数字排序

    在这个特定的C++程序中,哈希表被用来实现一个数字排序算法,特别是针对大整数范围内的数据。程序的目标是处理多组测试数据,每组数据包括两个整数n和m,以及n个在[-500000, 500000]区间内的整数。使用哈希表可以...

    C语言基于哈希表实现通讯录.doc

    C语言基于哈希表实现通讯录 在本文中,我们将探讨使用C语言基于哈希表实现通讯录的方法。哈希表是一种高效的数据结构,能够快速地存储和查找数据。在本文中,我们将通过设计和实现一个通讯录系统,来展示哈希表的...

    哈希表实现电话号码查询系统

    数据结构的课程设计 哈希表实现电话号码查询系统

    C/C++哈希表实现电话号码查询系统

    哈希表是一种高效的数据结构,它通过特定的函数(哈希函数)将数据映射到一个固定大小的数组中,从而实现快速的插入、查找和删除操作。在本项目"用C++实现的电话号码查询系统"中,哈希表被用来存储电话号码及其对应...

    哈希表实现简单说明-附代码

    在压缩包中的"hash表学习"文件中,可能包含了关于哈希表实现的具体代码示例,包括哈希函数的定义、冲突解决策略的实现以及插入、查找和删除操作的算法。通过阅读和理解这些代码,你可以更深入地了解哈希表的实际应用...

    哈希表实现通讯录

    (1)每个人的信息至少包括姓名,...(2)假设人名为汉语拼音全拼形式,待插入哈希表的长度为你所在班级的人数。哈希函数用除留余数法构造,采用链地址法或二次探测再散列法解决冲突。 (3)完成菜单设计。操作有必要的提示。

    数据结构课程设计C++基于哈希表实现的通讯录系统源码+课程设计报告(高分项目).zip

    数据结构课程设计C++基于哈希表实现的通讯录系统源码+课程设计报告(高分项目).zip代码完整,报告全面,下载即用。 数据结构课程设计C++基于哈希表实现的通讯录系统源码+课程设计报告(高分项目).zip代码完整,...

    C语言基于哈希表实现通讯录

    本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下 1.需求分析 本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。  (1)按提示输入相应的联系人的相关...

    课程设计哈希表的设计与实现

    《哈希表实现电话号码查询系统》 哈希表是一种高效的数据结构,广泛应用于各种数据库和查询系统中,尤其在电话号码查询系统中,它的快速查找能力显得尤为重要。本课程设计的目标是通过实现哈希表,提高对数据结构的...

    哈希表实现电话号码查询 报告.docx

    《哈希表实现电话号码查询》 在计算机科学中,数据结构是编程的基础,而哈希表作为一种高效的数据结构,广泛应用于各种信息查询系统。本报告主要探讨如何使用哈希表来实现电话号码的快速查询,以满足对学生信息管理...

    哈希表实现电话号码查询 报告.pdf

    报告书主要围绕使用哈希表实现电话号码查询这一主题展开,涵盖了从需求分析、系统设计到实现和总结的全过程。以下是相关知识点的详细说明: 1. **哈希表(Hash Table)**:哈希表是一种数据结构,它通过计算一个...

    C++哈希表实现.zip

    总之,C++中的哈希表实现涉及到哈希函数设计、冲突解决策略的选择以及相关的插入、查找和删除操作。通过`HashTest.cpp`和`Hashtable.h`,我们可以深入理解这些概念,并通过实际代码来学习和测试哈希表的功能和性能。

    哈希表的设计与实现C语言

    哈希表是一种高效的数据结构,它通过特定的算法——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。在C语言中,实现哈希表需要理解其基本原理,并掌握如何利用...

Global site tag (gtag.js) - Google Analytics