哈希表(散列)HashTable实现

原创 2015年07月07日 21:04:19

  最近刷Leetcode发现凡是找字符串中重复字符或者数组中找重复数据的时候就不知道从何下手了。
  所以决定学习一下哈希表解题,哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
  定义hash数据结构,我采用的解决冲突的方法是分离链接法。
  这里写图片描述

//单链表结构
typedef struct listnode* position;
typedef struct listnode* list;
struct listnode{
    ElementType data;
    position next;
};
//hash表结构
typedef struct hashtbl*  hashtable;
struct hashtbl {
    int tablesize;
    list *thelists;
};

哈希散列函数index = key%tablesize

index HashFunc(const ElementType key,int tablesize)
{
    //unsigned int hashval = 0;
    //while(*key != '\0')   
        //hashval = (hashval << 5) + *key++;
    //return hashval % tablesize;
    return key % tablesize;
}

创建hash表,并初始化

hashtable InitializeHashTable(int tablesize)
{
    hashtable H;
    H = (hashtable)malloc(sizeof(hashtable));
    if(NULL == H) return NULL;

    H->tablesize = tablesize;

    H->thelists = (list*)malloc(sizeof(list) * H->tablesize);
    int i = 0;
    for(i=0;i<H->tablesize;i++)//链表是有表头的单链表
    {
        H->thelists[i] = (list)malloc(sizeof(struct listnode));
        H->thelists[i]->next = NULL;
    }
    return H;
}

删除hash表

void DeleteHashTable(hashtable H)
{
    position P,tem;
    int i = 0;
    for(i=0;i<H->tablesize;i++)
    {
        P = H->thelists[i]->next;
        while(P != NULL)
        {
            tem = P;
            free(tem);
            P=P->next;
        }
    }
    free(H->thelists);
    free(H);
}

往hash表中插入新元素

position Find(ElementType key,hashtable H)
{
    position P;
    list L;
    L = H->thelists[ HashFunc( key, H->tablesize) ];
    P = L->next;
    while(P != NULL && P->data != key)
        P = P->next;

    return P;
}

void Insert(ElementType key,hashtable H)
{
    position pos,newnode;
    list L;
    pos = Find(key,H);
    if(pos == NULL)
    {
        newnode = (position)malloc(sizeof(position));
        L = H->thelists[ HashFunc( key, H->tablesize) ];
        newnode->data = key;
        newnode->next = L->next;
        L->next = newnode;
    }
}

打印hash表中所有的元素

void PrintHashTable(hashtable H)
{
    position P;
    int i = 0;
    for(i=0;i<H->tablesize;i++)
    {
        P = H->thelists[i]->next;
        printf("H->thelists[%d] = ",i);
        while(P != NULL)
        {
            printf("  %d",P->data);
            P=P->next;
        }
        printf("\n");   
    }
}

测试main函数

int main()
{
    int num[10] = {3,45,5,64,7,9,8,3,75,75};
    hashtable H;
    H = InitializeHashTable(10);
    int i = 0;
    for(i=0;i<10;i++)
    {   
        Insert(num[i],H);
    }
    PrintHashTable(H);
    DeleteHashTable(H);
}

头文件

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

typedef int ElementType;
typedef unsigned int index;

测试结果,可以看到图片中散列后在hash表中一样位置的都保存下来了,形成一个链表如数据75 5 45;但是相同的数据只保存一份,比如3和3,75和75
这里写图片描述
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

哈希表(散列)HashTable实现

最近刷Leetcode发现凡是找字符串中重复字符或者数组中找重复数据的时候就不知道从何下手了。   所以决定学习一下哈希表解题,哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种...

HashTable 哈希表/散列

前言在前面,我们提到过了几种搜索结构的树,二叉搜索树是根据左孩子节点的值小于根节点,右孩子节点的值大于根节点而建立的,当我们把n个数据插入到二叉搜索树中,最好情况下(数据插入后是一颗完全二叉树)我们查...

哈希表---开散列实现

#pragma once #ifndef _HASHTABLE_H_ #define _HASHTABLE_H_ #include #define defaultSize 100 struct S...
  • terry_v
  • terry_v
  • 2011年09月13日 23:41
  • 323

哈希表(一)(散列)分离链接法实现

编译环境:vs2015 实现100以内完全平方数的哈希表建立,当然更多数也是可以的……基本是例题难度,写了好大一天。 定义结构体: 主要实现函数: // ConsoleApplication5....

哈希表(Hash Table)及散列法(Hashing)

bigshuai 哈希  源地址 http://www.cnblogs.com/bigshuai/articles/2398116.html 哈希表(Hash Table)及...

数据结构---散列(哈希表)

本文以C语言描述散列,其中哈希函数可根据自己需要更改,以下是源代码: #include "HashSep.h" typedef uint64_t Index; static Index H...
  • luo560
  • luo560
  • 2017年02月18日 22:03
  • 128

哈希表(闭散列、拉链法--哈希桶)

哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构。它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据。 关于哈希表,主要为以下几个方面: ...

哈希表中线性探测再散列法及等概率条件下平均查找长度

最近复习了下数据结构中的哈希表,发现在计算等概率情况下查找不成功的平均查找长度时比较迷茫,不知道到底是怎么计算出来的。现在通过查阅资料终于知道如何计算了,所以记录下来以供以后查阅。   下面看下201...
  • shangruo
  • shangruo
  • 2013年01月10日 22:42
  • 15891

散列(Hash table)也称哈希表

一,与集合和字典的区别: 集合和字典(线性表,二叉搜索树,AVL树,B树)中元素与关键码没有直接的对应的关系, 而哈希表中元素与关键码有对应的关系,而这层关系通过哈希函数桥接,通过关键码映射到表中...

哈希表中线性探测再散列法及等概率条件下平均查找长度

最近复习了下数据结构中的哈希表,发现在计算等概率情况下查找不成功的平均查找长度时比较迷茫,不知道到底是怎么计算出来的。现在通过查阅资料终于知道如何计算了,所以记录下来以供以后查阅。 下面看下2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈希表(散列)HashTable实现
举报原因:
原因补充:

(最多只允许输入30个字)