哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding
哈希表添加
哈希表(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相关推荐
- 哈希表创建哈希表(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 ...
- 【STL学习】自己动手C++编程实现hash table(散列表)
SGI STL中散列表采用链接法解决冲突.结构中维护了一个vector,vector中每一个元素称为一个桶(bucket),它包含的是一个链表的第一个节点. 下面代码展示了自己编程实现的hash ta ...
- hash table(完全散列实现的哈希表)
hash table(完全散列实现的哈希表) 完全散列 特点:静态的,创建时候完成了散列表的生成. 不可以删,也不可以增加数据.只可以修改数据. 内部用全域散列生成 #ifndef C11LEARN_ ...
- hash table(全域散列法实现的哈希表)
hash table(全域散列法实现的哈希表) 利用每次重建哈希表时随机生成散列函数 #ifndef C11LEARN_HASHUNIVERSAL_H #define C11LEARN_HASHUNI ...
- MATLAB 基础知识 数据类型 表 添加和删除表行
本文演示了如何在表中添加和删除行.您也可以使用变量编辑器来编辑表. 加载样本数据 加载样本患者数据并创建一个表 T. load patients T = table(LastName,Gender,A ...
- Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.表的创建 ...
- Hash(哈希(字符串哈希))模板和做题总结(详细易懂)
文章目录 目录 文章目录 前言: 一 Hash表 1 Hash函数的构造 2 拉链法处理hash冲突模板 3 开放寻址法处理hash冲突 4(例题).雪花雪花 二 字符串Hash O(n)+O(m ...
- 数据结构 - 哈希表(散列表)
一.概念 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快 ...
- 哈希表(散列表)的介绍,代码实现
百度百科介绍的哈希表: 哈希表(Hash table,也叫散列表):是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访 ...
最新文章
- 单片机练习-RC-5红外遥控器程序及简单制造DIY PC遥控器
- 通过Spring配置文件中bean中的property赋值
- mysql 查看建表dll_关于C# Mysql.Data.dll 查询数据库表的一些小问题
- JavaScript cookie
- faster rcnn论文_faster-rcnn论文思路及代码编译
- CTFshow php特性 web93
- 重写Oracle的wm_concat函数,自定义分隔符、排序
- 使用 MarkDown DocFX 升级 Rafy 帮助文档
- GY歌谣之读懂每行代码(飞智) 2020 10 16 Duplicate keys detected
- 【智能优化算法-MOEA_D】基于MOEA_D求解联合经济排放调度(CEED)问题附matlab代码
- mysql 表空间碎片_MySQL碎片产生的原因及清除表空间碎片的方法
- windows日志文件查看与清理
- 判断App位于前台或者后台的6种方法
- 1.3、操作系统的发展和分类
- 怎么弄自动滚动的图片 html,HTML网页上连续滚动图片的制作
- wms仓库管理系统的订单处理及流程
- LeetCode 28 Implement strStr()(实现strStr()函数)
- DRF实战5 - 商品管理
- 人脸识别库face_recognition安装简单教程
- 褚达晨加入General Atlantic,任高级顾问
热门文章
- 在n个火柴里面拿3根出来拼接成最大三角形的周长
- php+对象+toarray_PHP 对象、数组间的转换
- js监听多个事件_JavaScript中的事件与异常捕获解析
- 开车走吗?朋友......
- 听说这是和女朋友住一起后的现象之一
- 还在为孩子学不好数学而犯愁?你想要知道的或许在这!
- python的数值类型_Python的数值类型
- python docx 字体大小_聊聊python办公自动化之Word(上)
- latex 1图加标题_使用VsCode编译latex心得
- java typereference_记录一下jackson中TypeReference的使用