• 数据结构实验,hash表
  • 采用链地址法处理hash冲突
  • 代码全部自己写,转载请留本文连接,
  • 附上代码
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<conio.h> #define NAMESIZE 20//姓名长度
    #define NULLKEY -32768//hash表空值
    #define HASHSIZE 30//定义hash表长度 typedef struct student
    {
    char name[NAMESIZE];
    int Snum;
    int Tnum;
    student *next=NULL;
    }stu; typedef struct
    {
    stu ** list;
    int count;
    }HashTable; int InitHashtable(HashTable *hash)
    {
    hash->count=0;
    hash->list=(stu **)malloc(HASHSIZE *sizeof(stu *));
    if(!hash->list)
    return -1;
    for(int i=0;i<HASHSIZE;i++)
    {
    hash->list[i]=NULL;
    }
    return 1;
    }
    int hash(stu stu)
    {
    int hashseed=0;
    for(int a=0;stu.name[a]!='\0';a++)
    {
    hashseed=hashseed*7+(int)stu.name[a];
    }
    int hashvalue=NULLKEY;
    srand(hashseed);
    hashvalue=rand()%HASHSIZE;
    return hashvalue;
    }
    int intohashtable(HashTable *htable,student *stu)
    {
    int H1=hash(*stu);
    if(htable->list[H1]!=NULL)//hash冲突
    {
    student *p;
    p=(student *)malloc(sizeof(student));
    p=stu;
    p->next=htable->list[H1];
    htable->list[H1]=p; }
    else
    htable->list[H1]=stu;
    htable->count++;
    return 1;
    }
    int addstudent(HashTable *htable)
    {
    char name[NAMESIZE];
    int snum,tnum;
    stu *stu1;
    stu1=(student *)malloc(sizeof(student));
    printf("请输入姓名:\t");fflush(stdin);
    scanf("%s",name);
    printf("请输入学号:\t");
    scanf("%d",&snum);
    printf("请输入电话号:\t");
    scanf("%d",&tnum);
    if(!name)
    {
    printf("addstudent__error");
    return 0;
    }
    strcpy(stu1->name,name);
    stu1->Snum=snum;
    stu1->Tnum=tnum;
    stu1->next=NULL;
    if(intohashtable(htable,stu1))
    return 1;
    else
    {
    printf("into_error");
    return 0;
    }
    }
    int findhashtable(HashTable *htable)
    {
    printf("\t2-查找\n");
    char name[NAMESIZE];
    printf("请输入要查找的姓名:");
    scanf("%s",name);
    stu stu0;
    strcpy(stu0.name,name);
    stu0.next=NULL;
    stu0.Snum=0;
    stu0.Tnum=0;
    int hashkey;
    hashkey=hash(stu0);
    if(htable->list[hashkey]==NULL)
    printf("查找的值不存在\n");
    if(htable->list[hashkey!=NULL])
    {
    stu *p;
    p=htable->list[hashkey];
    while(p)
    {
    if(name==p->name)
    printf("你找的信息为:\n姓名:%s\t学号:%d\t电话号码%d\n",htable->list[hashkey]->name,htable->list[hashkey]->Snum,htable->list[hashkey]->Tnum);
    if(p->next==NULL)
    break;
    p=p->next;
    }
    }
    printf("你找的信息为:\n姓名:%s\t学号:%d\t电话号码%d\n",htable->list[hashkey]->name,htable->list[hashkey]->Snum,htable->list[hashkey]->Tnum);
    getch();
    }
    int main()
    {
    HashTable *htable;
    htable =(HashTable *)malloc(sizeof(HashTable));
    InitHashtable(htable);
    int T=1;
    for(int a=1;T;a++)
    {
    system("cls");
    printf("\t哈希表设计实验\n");
    printf("1-添加\n2-查找\n3-输出hash表\n0-退出\n");
    scanf("%d",&T);
    if(T==1)
    for(char c;1;1)
    {
    if(!addstudent(htable))
    printf("addstudent返回error\n");
    printf("是否继续输入如 y/n:\t");
    fflush(stdin);
    c=getchar();
    if(c=='n'||c=='N')
    break;
    }
    if(T==2)
    findhashtable(htable);
    if(T==3)
    {
    student *p;
    printf("储存的数据个数为%d个\n",htable->count);
    for(int a=0;a<HASHSIZE;a++)
    {
    printf("%d\t",a);
    p=htable->list[a];
    int t=0;
    while(p)
    {
    t=1;
    printf("%s\t",p->name);
    // if(p->next==NULL)
    // break;
    p=p->next;
    }
    if(t==0)
    printf("0");
    printf("\n");
    }
    getch();
    }
    }
    }

数据结构,哈希表hash设计实验的更多相关文章

  1. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  2. 数据结构 哈希表(Hash Table)_哈希概述

    哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...

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

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

  4. (js描述的)数据结构[哈希表1.1](8)

    (js描述的)数据结构[哈希表1.1](8) 一.数组的缺点 1.数组进行插入操作时,效率比较低. 2.数组基于索引去查找的操作效率非常高,基于内容去查找效率很低. 3.数组进行删除操作,效率也不高. ...

  5. 数据结构 -- 哈希表(hash table)

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

  6. C#数据结构----------------------------哈希表源码解析

    转载: C# Hashtable源码剖析 源代码版本为 .NET Framework 4.6.1 本系列持续更新,敬请关注 有投入,有产出. Hashtable实现一个哈希表(也叫散列表),将键映射到 ...

  7. PHP关联数组和哈希表(hash table) 未指定

    PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...

  8. JAVA数据结构--哈希表的实现(分离链接法)

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

  9. 第三十四篇 玩转数据结构——哈希表(HashTable)

    1.. 整型哈希函数的设计 小范围正整数直接使用 小范围负整数整体进行偏移 大整数,通常做法是"模一个素数"   2.. 浮点型哈希函数的设计 转成整型进行处理   3.. 字符串 ...

随机推荐

  1. 【Redis】利用 Redis 实现分布式锁

    技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...

  2. Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理

    本文完整代码下载点击 一. 前言 相信了解过我或者看过我之前的系列文章应该多少知道点我写这些文章包括创建 有来商城youlai-mall 这个项目的目的,想给那些真的想提升自己或者迷茫的人(包括自己- ...

  3. docker下启动单机nacos

    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server 参数说明: MODE standalo ...

  4. jQuery 第四章 实例方法 DOM操作之data方法

    jquery 里面 的 data 方法比较重要, 所以成一个模块写: 首先, 得知道 data()  干嘛用的, 看淘宝上 有自定义的属性, 为data -  什么什么,   这是为了dom 跟数据有 ...

  5. SQL server分页的四种方法(算很全面了)

      这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...

  6. Java中的单例模式最全解析

    单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式.它不但被应用在实际的工作中,而且还是面试中最常考的题目之一.通过单例模式我们可以知道此人 ...

  7. nginx + lua-nginx-module 编译

    摘要:本文主要介绍如何将lua-nginx-module 编译到nginx主程序中. nginx是一个高性能的反向代理服务器,lua是一个小巧的脚本语言,利用lua-nginx-module模块可以使 ...

  8. mq存储文件

    存储文件 启动broker之后我们可以看到下面这些文件 1.config包含了运行期间一些配置信息,主要包括下列信息. consumerFilter.json:主体消息过滤信息 consumerOff ...

  9. [BUGCASE]前端码案概述

    中医有医案之说,程序会出bug,因此想到将自己在项目中遇到的疑难bug记录下来的想法,出于以下目的: 沉淀经验 通过问题学习 训练解决问题的能力 训练文档写作能力 取名:码案(Bug Case). 医 ...

  10. redis雪崩,击穿,穿透

    redis穿透 什么是redis穿透? 1.查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存 2.这将导致这个不存在的数据每次请求都要到存储层 ...