HASH表的创建(C语言)

HASH表的创建(C语言)


一、简介:

哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字 key为自变量,通过一种函数H(key)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈函数或散列函数。按这种方法建立的表称为哈希表或散列表。

二、哈希冲突:

不同key值产生相同的地址,H(key1)=H(key2)

处理冲突的方法:

(1)开放寻址法:, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,为增量序列,可有下列三种取法:
1.=1,2,3,…, m-1,称线性探测再散列;
2…,(k<=m/2)称二次探测再散列;
3.=伪随机数序列,称伪随机探测再散列。
最终存储结果 55 1 23 14 68 11 37 19 86
(2)再散列法:,i=1,2,…,k。均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间

(3)链地址法(拉链法):将所有关键字为同义词的记录存储在同一线性链表中,产生hash冲突后在存储数据后面加一个指针,指向后面冲突的数据:
img

三、代码
#include<stdio.h>
#include<stdlib.h>
#define NUM 5
typedef struct HashList
{
    int num;			//表内当前的数据个数
    char *data;			//保存数据的数组
}HashList;

//hash表的初始化
HashList *initList()
{
    HashList *list = (HashList *)malloc(sizeof(char)*NUM);
    list->num = 0;
    list->data = (char*)malloc(sizeof(char)*NUM);
    for(int i = 0;i < NUM;i++)
    {
        list->data[i] = 0;		//将表内元素初始化为0
    }
    return list;
}

//获取位置的下标
int hash(int data)
{
    return data % NUM;
}

//放入哈希表
void put(HashList *list,char data)
{
    int index = hash(data);		//获取下标
    if(list->data[index] != 0)
    {
        int count = 1;			//计数,便于解决冲突
        while(list->data[index] != 0)
        {
            index = hash(hash(data) + count);	//解决冲突,如果下标位置有数据,则下标+1,直至下标位置上没有数据
            count++;
        }
    }
    list->data[index] = data;
}

int main()
{
    HashList *list = initList();
    char str[10];
    scanf("%s",str);
    int i;
    for(i = 0;str[i] != '\0';i++)
    {
        put(list,str[i]);
    }
    int j = 0;
    while(j<i)
    {
        printf("%c\n",list->data[j++]);
    }
}

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希是一种数据结构,用于实现字典或映射。哈希使用哈希函数将键映射到存储桶中,以便快速查找值。链地址法是哈希的一种实现方式,它使用链来解决哈希冲突的问题。下面是使用链地址法实现哈希的C语言代码示例: 首先,定义一个哈希节点的结构体: ``` typedef struct HashNode{ int key; int value; struct HashNode* next; }HashNode; ``` 哈希节点包含键值对和一个指向下一个节点的指针。 接着,定义一个哈希的结构体: ``` typedef struct HashTable{ int size; HashNode** table; }HashTable; ``` 哈希包含一个大小和一个指向指针数组的指针。 接下来,实现哈希函数,将键映射到存储桶中: ``` int hash(int key, int size){ return key % size; } ``` 这里使用取模运算将键映射到存储桶中。 然后,实现哈希的初始化函数: ``` HashTable* createHashTable(int size){ HashTable* ht = (HashTable*)malloc(sizeof(HashTable)); ht->size = size; ht->table = (HashNode**)malloc(sizeof(HashNode*) * size); for(int i = 0; i < size; i++){ ht->table[i] = NULL; } return ht; } ``` 这里使用malloc动态分配哈希和指针数组的内存空间,并将指针数组中的元素初始化为NULL。 接下来,实现插入操作: ``` void insert(HashTable* ht, int key, int value){ int index = hash(key, ht->size); HashNode* node = (HashNode*)malloc(sizeof(HashNode)); node->key = key; node->value = value; node->next = ht->table[index]; ht->table[index] = node; } ``` 这里首先使用哈希函数计算键的索引,然后创建一个新的哈希节点并将其插入到链的头部。 最后,实现查找操作: ``` int search(HashTable* ht, int key){ int index = hash(key, ht->size); HashNode* node = ht->table[index]; while(node != NULL){ if(node->key == key){ return node->value; } node = node->next; } return -1; } ``` 这里首先使用哈希函数计算键的索引,然后遍历该索引处的链,查找对应的键值对。如果找到,则返回其值,否则返回-1。 以上就是使用链地址法实现哈希的C语言代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值