哈希表添加

哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。哈希表相关定义如下:

typedef enum{HASH_OK,HASH_ERROR,HASH_ADDED,HASH_REPLACED_VALUE,HASH_ALREADY_ADDED,HASH_DELETED,HASH_NOT_FOUND,
} HASH_RESULT;typedef struct __HashEntry HashEntry;
struct __HashEntry{union{char  *str_value;double dbl_value;int       int_value;} key;union{char  *str_value;double dbl_value;int       int_value;long   long_value;void  *ptr_value;} value;HashEntry *next;
};struct __HashTable{HashEntry **bucket;        int size;HASH_RESULT last_error;
};
typedef struct __HashTable HashTable;// 向哈希表中添加元素,其中键类型为char*, 元素类型为int。
HASH_RESULT hash_add_int(HashTable * table, const char * key, int value);

哈希表相关说明:
HASH_RESULT 类型为相关函数的返回类型
HashEntry 为哈希表所保存元素(即键值对 《key, value》)类型
HashTable 为哈希表,其中 bucket 指向大小为size的、元素类型为 HashEntry*的指针数组
哈希表采用链地址法处理冲突
请实现 hash_add_int 函数,向哈希表中添加元素,其中键类型为char*, 元素类型为int。
在添加过程中,如果要添加的键值key已在哈希表中,且对应的值value也已存在,则函数返回 HASH_ALREADY_ADDED;
如果要添加的键值key已在哈希表中,但对应的值value不同,函数将value值更新到哈希表中,之后返回 HASH_REPLACED_VALUE
如果要添加的键值key不在哈希表中,则函数创建 HashEntry 类型,并将其加入到哈希表中,且函数返回 HASH_ADDED。
本题所用的哈希函数如下:

long hash_string(const char *str)
{long hash = 5381;int c;while (c = *str++)hash = ((hash << 5) + hash) + c; /* hash * 33 + c */if(hash < 0)hash *= -1;return hash;
}

//这一段看不懂就不管

#include <stdio.h>
#include "stdlib.h"
#include "hash.h"
#include <string.h>HASH_RESULT hash_add_int(HashTable *table, const char *key, int value ){HashEntry *p;//指的是每一个键值对 int h = hash_string(key) % table->size;//保存哈希函数返回值 //int类型也可以 // !h %= table->size; 编译器奇怪的不通过..... //该关键字对应的哈希表中键值对不存在, 分配节点存入 if(!table->bucket[h]){p = (HashEntry *)malloc(sizeof(HashEntry));if(!p) return HASH_ERROR;p->key.str_value = (char *)malloc(strlen(key));if(!p->key.str_value){free(p);return HASH_ERROR;}//!!!!字符串拷贝 strcpy(p->key.str_value, key);p->value.int_value = value;//最好还是置空 p->next = NULL;table->bucket[h] = p;return HASH_ADDED;}//关键字对应的哈希表中该位置存在键值对,判断重复或者冲突 p = table->bucket[h];while(p){  //关键字相同 if(strcmp(key, p->key.str_value)==0){//判断值 if(p->value.int_value == value){return HASH_ALREADY_ADDED;}else{p->value.int_value = value;return HASH_REPLACED_VALUE;}}//链地址法 else{if(p->next)p = p->next;elsebreak;}}//循环完成后 //p指向最后一个结点 HashEntry *q;//q接到p后面 q = (HashEntry *)malloc(sizeof(HashEntry));if(!q) return HASH_ERROR;q->key.str_value = (char *)malloc(strlen(key));if(!q->key.str_value){free(q);return HASH_ERROR;}strcpy(q->key.str_value, key);q->value.int_value = value;q->next = NULL;p->next = q;return HASH_ADDED;}

哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding相关推荐

  1. 哈希表创建哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.typedef enum{ HASH_OK-icoding-数据结构-C

    哈希表创建 typedef enum{HASH_OK,HASH_ERROR,HASH_ADDED,HASH_REPLACED_VALUE,HASH_ALREADY_ADDED,HASH_DELETED ...

  2. 【STL学习】自己动手C++编程实现hash table(散列表)

    SGI STL中散列表采用链接法解决冲突.结构中维护了一个vector,vector中每一个元素称为一个桶(bucket),它包含的是一个链表的第一个节点. 下面代码展示了自己编程实现的hash ta ...

  3. hash table(完全散列实现的哈希表)

    hash table(完全散列实现的哈希表) 完全散列 特点:静态的,创建时候完成了散列表的生成. 不可以删,也不可以增加数据.只可以修改数据. 内部用全域散列生成 #ifndef C11LEARN_ ...

  4. hash table(全域散列法实现的哈希表)

    hash table(全域散列法实现的哈希表) 利用每次重建哈希表时随机生成散列函数 #ifndef C11LEARN_HASHUNIVERSAL_H #define C11LEARN_HASHUNI ...

  5. MATLAB 基础知识 数据类型 表 添加和删除表行

    本文演示了如何在表中添加和删除行.您也可以使用变量编辑器来编辑表. 加载样本数据 加载样本患者数据并创建一个表 T. load patients T = table(LastName,Gender,A ...

  6. Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.表的创建 ...

  7. Hash(哈希(字符串哈希))模板和做题总结(详细易懂)

    文章目录 目录 文章目录 前言: 一 Hash表 1 Hash函数的构造 2 拉链法处理hash冲突模板 3 开放寻址法处理hash冲突 4(例题).雪花雪花 二   字符串Hash O(n)+O(m ...

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

    一.概念 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快 ...

  9. 哈希表(散列表)的介绍,代码实现

    百度百科介绍的哈希表: 哈希表(Hash table,也叫散列表):是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访 ...

最新文章

  1. 单片机练习-RC-5红外遥控器程序及简单制造DIY PC遥控器
  2. 通过Spring配置文件中bean中的property赋值
  3. mysql 查看建表dll_关于C# Mysql.Data.dll 查询数据库表的一些小问题
  4. JavaScript cookie
  5. faster rcnn论文_faster-rcnn论文思路及代码编译
  6. CTFshow php特性 web93
  7. 重写Oracle的wm_concat函数,自定义分隔符、排序
  8. 使用 MarkDown DocFX 升级 Rafy 帮助文档
  9. GY歌谣之读懂每行代码(飞智) 2020 10 16 Duplicate keys detected
  10. 【智能优化算法-MOEA_D】基于MOEA_D求解联合经济排放调度(CEED)问题附matlab代码
  11. mysql 表空间碎片_MySQL碎片产生的原因及清除表空间碎片的方法
  12. windows日志文件查看与清理
  13. 判断App位于前台或者后台的6种方法
  14. 1.3、操作系统的发展和分类
  15. 怎么弄自动滚动的图片 html,HTML网页上连续滚动图片的制作
  16. wms仓库管理系统的订单处理及流程
  17. LeetCode 28 Implement strStr()(实现strStr()函数)
  18. DRF实战5 - 商品管理
  19. 人脸识别库face_recognition安装简单教程
  20. 褚达晨加入General Atlantic,任高级顾问

热门文章

  1. 在n个火柴里面拿3根出来拼接成最大三角形的周长
  2. php+对象+toarray_PHP 对象、数组间的转换
  3. js监听多个事件_JavaScript中的事件与异常捕获解析
  4. 开车走吗?朋友......
  5. 听说这是和女朋友住一起后的现象之一
  6. 还在为孩子学不好数学而犯愁?你想要知道的或许在这!
  7. python的数值类型_Python的数值类型
  8. python docx 字体大小_聊聊python办公自动化之Word(上)
  9. latex 1图加标题_使用VsCode编译latex心得
  10. java typereference_记录一下jackson中TypeReference的使用