#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR 0
#define OK 1
#define Size 21 // 指定质数(数组长度)
typedef struct{
char name[];
char address[];
char num[];
}mul;
typedef struct{
mul data[];
int size;
}Hashtable;
void init(Hashtable &h)
{
for(int i=;i<Size;i++){
h.data[i].num[]=;//首位赋为0
}
h.size = Size;
}
// 判断电话簿是否为空
int kong(Hashtable &h){
for(int i=;i<Size;i++){
if(h.data[i].num[]!=){
return ERROR;
}
}
return OK;
}
int HashSearch(Hashtable &h); // 新存入的数的和是否已经被存储了
int c_t(Hashtable &h,int sum){
int m,n,sum1=;
for(int k=;k<Size;k++){ //循环整个数组
n = strlen(h.data[k].num);
if(h.data[k].num[]!=){
for(m=;m<n;m++){
sum1=sum1+h.data[k].num[m]-'';
}
if(sum1==sum){
printf("您输入的电话号码已经被存储,请重新输入\n\n");
HashSearch(h);
fflush(stdin);
return ERROR;
}
}
}
return OK;
}
// 寻址存数
int HashSearch(Hashtable &h)
{
char nu[],na[],add[];
int i,p,j,y=,boo=;//nu关键字
int m,n,sum=,sum1=;
printf("请输入要存入的电话记录的姓名、地址和11位手机号码(用空格隔开)\n");
scanf("%s",na);
scanf("%s",add);
scanf("%s",nu);
n=strlen(nu); // 电话号的长度
if(n==){
for(m=;m<n;m++){
sum=sum+nu[m]-''; // 计算电话号码的总和进行存储
}
boo=c_t(h,sum); // 判断输入的数是否被存储了
if(boo){
j=sum%Size;//哈希函数
if(h.data[j].num[]==){
p=j;
h.size=j;
}else{
i=(j+)%Size; // 向后探测一个位置
if(h.data[i].num[]==){
p=i;
h.size=i;
}
while(h.data[i].num[]!= && i!=j) {
i=(i+)%Size; //向后探测位置
if(h.data[i].num[]==){
p=i;
h.size=i;
break;
}
}
if (i==j){
printf("当前电话谱最多只能实现 %d 个数据存储\n",Size);
return ERROR;
}
}
strcpy(h.data[p].num,nu); // 把存入的数据放入定义的数组指定位置
strcpy(h.data[p].address,add);
strcpy(h.data[p].name,na);
printf("存入数据 %d 号位置: %s %s %s\n",h.size,h.data[p].name,h.data[p].address,h.data[p].num);
}
}else{
printf("\n!!!请输入11位手机号码!!!\n");
HashSearch(h);
}
return OK;
}
// 批量存入电话记录
int pl_HashSearch(Hashtable &h){
int n=;
printf("请输入您要添加电话记录的条数:");
scanf("%d",&n);
if(<n&&n<){
for(int i=;i<n;i++){
HashSearch(h);
}
}else{
printf("\n您存入的条数大于20条 或者小于2条\n\n");
pl_HashSearch(h);
}
return OK;
}
// 打印所有记录
void disp(Hashtable &h)
{
printf("电话簿中电话记录如下:\n");
for(int i=;i<Size;++i){
if(h.data[i].num[]){
printf("%d号位置\n姓名:%s 地址:%s 电话:%s\n",i,h.data[i].name,h.data[i].address,h.data[i].num);
}
}
}
// 哈希查找
int hash_kind(Hashtable h){
char num[];
int i,j,y=;//nu关键字
int m,n,sum=;
printf("请输入您要在电话簿中查找的电话号码:\n");
scanf("%s",&num);
n=strlen(num); // 电话号的长度
for(m=;m<n;m++){
sum=sum+num[m]-''; // 计算电话号码的总和进行存储
}
j=sum%Size;//哈希函数
if(strcmp(h.data[j].num,num)==){ // 探测查找
printf("您要查找的相关信息:%d号位置: \n姓名:%s\n地址:%s\n电话号码:%s\n",j,h.data[j].name,h.data[j].address,h.data[j].num);
}
else{
i=(j+)%Size;
while(h.data[i].num[]!= && i!=j) {
if(strcmp(h.data[i].num,num)==){
printf("您要查找的相关信息:%d号位置 : \n姓名:%s\n地址:%s\n电话号码:%s\n",i,h.data[j].name,h.data[j].address,h.data[j].num);
break;
}
i=(i+)%Size; //向后探测一个位置
}
if(h.data[i].num[]==){
printf("\n(嘟。。)当前号码谱没有此号码!!查无此人!!查无此人!!\n");
return ERROR;
} }
return OK;
}
//操作菜单
void OperateMenu(){ printf("\n\n--------------请选择元素处理方式---------\n\n");
printf("注:电话号应为 11 位\n\n");
printf("0> :退出\n\n");
printf("1>: 存入电话号\n\n");
printf("2>: 批量存入电话号\n\n");
printf("3>: 哈希查找电话号\n\n");
printf("4>: 显示电话簿\n\n");
printf("请选择对元素的处理:");
}
void main(){
int w=,k,boo=,i=,e=;
Hashtable h;
printf("注:此测试过程输入值应全为数字\n\n");
printf("进入号码簿存储请输入:'1'\n\n");
printf("退出请选择'0'或 其它!!\n\n");
printf("请选择:");
scanf("%d",&w);
if(w==){
init(h);
OperateMenu();
scanf("%d",&k);
while(k){
switch(k){
case :break;
case :boo=HashSearch(h);
if(boo)
printf("存入成功!!\n");
else
printf("存入失败!!\n");
break;
case :boo=pl_HashSearch(h);
if(boo)
printf("批量存入成功!!\n");
else
printf("批量存入失败!!\n");
break;
case :boo=kong(h);
if(boo==){
printf("\n!!当前电话簿为空!!\n");
}else{
boo=hash_kind(h);
if(boo)
printf("哈希查找成功!!\n");
else
printf("哈希查找失败!!\n");
}
break; case :
boo=kong(h);
if(boo==){
printf("\n!!当前电话簿为空!!\n");
}else{disp(h); }break;
}
OperateMenu();
scanf("%d",&k);
}
}
}

c_数据结构_哈希表的更多相关文章

  1. 数据结构 5 哈希表/HashMap 、自动扩容、多线程会出现的问题

    上一节,我们已经介绍了最重要的B树以及B+树,使用的情况以及区别的内容.当然,本节课,我们将学习重要的一个数据结构.哈希表 哈希表 哈希也常被称作是散列表,为什么要这么称呼呢,散列.散列.其元素分布较 ...

  2. 数据结构是哈希表(hashTable)

    哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射 ...

  3. python数据结构之哈希表

    哈希表(Hash table) 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是Has ...

  4. 算法与数据结构基础 - 哈希表(Hash Table)

    Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...

  5. 数据结构HashMap哈希表原理分析

    先看看定义:“散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. 哈希 ...

  6. 数据结构,哈希表hash设计实验

    数据结构实验,hash表 采用链地址法处理hash冲突 代码全部自己写,转载请留本文连接, 附上代码 #include<stdlib.h> #include<stdio.h> ...

  7. js:数据结构笔记7--哈希表

    哈希表(散列表):通过哈希函数将键值映射为一个字典; 哈希函数:依赖键值的数据类型来构建一个哈希函数: 一个基本的哈希表:(按字符串计算键值) function HashTable() { this. ...

  8. C++数据结构之哈希表

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方.键可以对应多个值(即哈希冲突),值根据相应的hash公式存入对应的键中. 哈希函数的构造要求 ...

  9. JAVA数据结构之哈希表

    Hash表简介: Hash表是基于数组的,优点是提供快速的插入和查找的操作,编程实现相对容易,缺点是一旦创建就不好扩展,当hash表被基本填满的时候,性能下降非常严重(发生聚集引起的性能的下降),而且 ...

随机推荐

  1. 13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串

    13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s))   ...

  2. 【持续更新】leetcode算法-数组篇

    会在近期陆续地完成数组篇的整理,希望对找工作的小伙伴有所帮助.   1.Two Sum:两数相加为一固定值,求其下标.一次遍历数组,用一个hash表存储已经访问过的数及其下标,对于新访问的数value ...

  3. Class类的作用?生成Class对象的方法有哪些?

    Class类是Java 反射机制的起源和入口,用于获取与类相关的各种信息,提供了获取类信息的相关方法.Class类继承自Object类 Class类是所有类的共同的图纸.每个类有自己的对象,好比图纸和 ...

  4. vue 外卖app(2) stylus

    1.安装 npm  install stylus   stylus-loader  --save-dev 安装成功 2.编写样式 <style  lang="stylus" ...

  5. 伪类元素before&after

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 物理像素,逻辑像素,解决1px的问题

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  7. java.lang.InstantiationException: com.lch.commder.entity.Car 已解决

    以上的上异常,是你的类实例化对象失败的时候抛出异常,这种异常多会出现在抽象类中,在使用反射的机制时,解决方法很简单 在你的类中再加一个空构造方法

  8. bzoj1051题解

    [题意分析] 给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点. [解题思路] 如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为0. 然后先用tarjan缩一波强连通分量 ...

  9. Python 爬取拉钩网工作岗位

    如果拉钩网html页面做了调整,需要重新调整代码 代码如下 #/usr/bin/env python3 #coding:utf-8 import sys import json import requ ...

  10. NOIp2018集训test-9-2(pm)

    其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int 但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的.主要是林巨已经虐我125了要是再虐我200分我大概 ...