用c语言实现基本数据结构(哈希表)

写这个哈希表总是段错误,找了半天的bug。。。原来是各种小错误不断,写得很蛋疼。

我是是用数组实现的,数组的最大值定义成的宏。一共只有四个函数,分别为初始化哈希表,构造哈希函数,将数据存进去,将数据取出来。

我假设的关键字范围为10以内的英文字母组合。

解决哈希冲突的方法用的线性探测。用这个,是因为比较简单。。。:)

结构体如下

struct hashdata{int data;char* key;
};

完整代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXHASH 1000struct hashdata{int data;char* key;
};void initHash(struct hashdata* hashTable,  int len){for(int i = 0; i< len; i++){hashTable[i].data = 0;hashTable[i].key = NULL;}
}int convertHash(char * key){int re = 0;int len = strlen(key);if(len > 10){printf("key should less than 10 char");}for(int i = 0; i < len; i++){re += (float)(key[i]-65)*MAXHASH/10/48;}return (int)re;
}int saveHash(struct hashdata* hashTable, char* key, int data){int pos = convertHash(key);if(hashTable[pos].key == NULL){hashTable[pos].data = data;hashTable[pos].key = key;}else if(!strcmp(hashTable[pos].key, key)){hashTable[pos].data = data;printf("\nsave success!\n");return 1;}else{for(int i = 0; i< MAXHASH; i++){pos = (pos+1)%MAXHASH;if(hashTable[pos].key == NULL){hashTable[pos].data = data;hashTable[pos].key = key;printf("\nsave success!\n");return 1;}}}return 0;
}int findHash(struct hashdata* hashTable, char* key){int pos = convertHash(key);if(hashTable[pos].key == NULL){printf("\nno this data\n");return  0;}if(!strcmp(hashTable[pos].key, key)){return hashTable[pos].data;}else{for(int i = 0; i< MAXHASH; i++){pos = (pos+1)%MAXHASH;if(hashTable[pos].key == NULL){return  0;}if(!strcmp(hashTable[pos].key, key)){return hashTable[pos].key;}}}printf("\nno this data\n");return 0;
}

测试代码如下

#include"myHash.h"int main(){struct hashdata* hashTable = (struct hashdata *)malloc(4*MAXHASH);printf("-----------------------\n");initHash(hashTable, MAXHASH);printf("-----------------------\n");saveHash(hashTable, "apple", 1000);saveHash(hashTable, "you", 888);saveHash(hashTable, "you", 999);saveHash(hashTable, "tree", 20);printf("-----------------------\n");printf("%d\n",  findHash(hashTable, "you") );printf("%d\n", findHash(hashTable, "is"));
}

用c语言实现基本数据结构(哈希表)相关推荐

  1. Python中常用的数据结构---哈希表(字典)

    Python中常用的数据结构-哈希表(字典) 常用的数据结构有数组.链表(一对一).栈和队列.哈希表.树(一对多).图(多对多)等结构. 在本目录下我们将讲解,通过python语言实现常用的数据结构. ...

  2. 数据结构——哈希表的详解与实现

    数据结构--哈希表(HashTable) 1.前言 ​ 当我们频繁的查找数据中的某个元素时,我们通常会选择数组来存放数据,因为数组的的内存是连续的,可以直接通过下标访问数据,但是它添加和删除数据比较麻 ...

  3. 数据结构哈希表的实现与设计

    数据结构哈希表查找姓名的课程设计 有没有大神能帮忙写一下这道题,课设的题目.用C++语言 问题描述:针对某公司中花名设计哈希表,并完成相应的建表和查表程序,基本要求: (1)假设花名为汉字拼音形式.名 ...

  4. java hashtable 数据结构_数据结构--哈希表(Java)

    数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...

  5. 哈希(散列)(三):C语言实现 动态态哈希表

    哈希(散列)的概念: https://blog.csdn.net/mowen_mowen/article/details/82943192 C语言实现:静态哈希表: https://blog.csdn ...

  6. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题

    layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...

  7. C语言实现简单的哈希表

    CRC是通信领域中用于校验数据传输正确性的最常用机制,也是Hash算法的一个典型应用,Hash一般翻译为"散列",也可直接音译为"哈希",就是把任意长度的输入( ...

  8. 数据结构 — 哈希表

    目录 文章目录 目录 哈希表 哈希表 哈希表,又称为散列表,是根据键值对(Key/Value)进行访问的数据结构,它让 Value 经过哈希函数的转换映射到哈希表对应的位置上,查找效率非常高.哈希索引 ...

  9. 哈希表数据结构_Java数据结构哈希表如何避免冲突

    前言 一.哈希表是what? 这是百度上给出的回答: 简而言之,为什么要有这种数据结构呢? 因为我们想不经过任何比较,一次从表中得到想要搜索的元素.所以就构造出来了哈希表,通过某种函数(哈希函数)使元 ...

  10. openssl lhash 数据结构哈希表

    哈希表是一种数据结构,通过在记录的存储位置和它的关键字之间建立确定的对应关系,来快速查询表中的数据: openssl lhash.h 为我们提供了哈希表OPENSSL_LHASH 的相关接口,我们可以 ...

最新文章

  1. oracle分页的使用,oracle中分页的实现方式.rownum的使用
  2. uncompressing linux .................................................后没反应解决办法
  3. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列
  4. https Java SSLException protocol_version的问题解决方法
  5. 实验6      VRRP网关备份(下)
  6. Spark性能优化:对RDD持久化或CheckPoint操作
  7. HashSet源码分析 jdk1.6
  8. 网上看到的一个百度实习生笔试题
  9. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
  10. 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(二)
  11. linux mac time machine,用 Ubuntu 10.10 构建 Time Machine 备份服务器
  12. 全球以太网交换机和路由器市场:谁领跑?
  13. 华为lab-rs-v1-2.3_OSPF基础
  14. 如何判断某版本的.NET Framework是否安装
  15. 选择checkbox显示隐藏内容
  16. 「Android - SoundPool使用」
  17. U盘有必要安全弹出吗??
  18. 从小白开始教你怎样在Eclipse中使用Git(番外) - 各种图标的含义
  19. python中用来抛出异常的关键字是( )_python如何抛出异常
  20. 【CV/Matlab系列】基于图像处理的苹果质量检测和分级系统【含Matlab源码】

热门文章

  1. 人人都在用的机器学习算法-决策树
  2. 性能服务器主板开机进bios,台式机华硕主板开机就进入bios?
  3. markdown自动生成导航目录
  4. 液冷数据中心如何构建,蓝海大脑液冷技术保驾护航
  5. educoder锁存器和触发器设计之主从D触发器设计+门控D锁存器设计
  6. Pytorch 学习(2):神经网络及训练一个分类器(cifar10_tutorial的网络结构图)
  7. 力扣第四十六题(全排列)详解
  8. 搭便车的时候,请别把车砸了。
  9. 星形接法和三角形接法电压和电流关系
  10. Java基础入门必须了解的英语词汇