数据结构,哈希表hash设计实验
- 数据结构实验,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设计实验的更多相关文章
- Redis原理再学习04:数据结构-哈希表hash表(dict字典)
哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...
- 数据结构 哈希表(Hash Table)_哈希概述
哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- (js描述的)数据结构[哈希表1.1](8)
(js描述的)数据结构[哈希表1.1](8) 一.数组的缺点 1.数组进行插入操作时,效率比较低. 2.数组基于索引去查找的操作效率非常高,基于内容去查找效率很低. 3.数组进行删除操作,效率也不高. ...
- 数据结构 -- 哈希表(hash table)
简介 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...
- C#数据结构----------------------------哈希表源码解析
转载: C# Hashtable源码剖析 源代码版本为 .NET Framework 4.6.1 本系列持续更新,敬请关注 有投入,有产出. Hashtable实现一个哈希表(也叫散列表),将键映射到 ...
- PHP关联数组和哈希表(hash table) 未指定
PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...
- JAVA数据结构--哈希表的实现(分离链接法)
哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...
- 第三十四篇 玩转数据结构——哈希表(HashTable)
1.. 整型哈希函数的设计 小范围正整数直接使用 小范围负整数整体进行偏移 大整数,通常做法是"模一个素数" 2.. 浮点型哈希函数的设计 转成整型进行处理 3.. 字符串 ...
随机推荐
- SQL Server 不同数据间建立链接服务器进行连接查询
在平时查询以及导数据时,经常会遇到需要使用两个数据库里数据的情况,这时就会用到在两个服务器之间建立一个链接,进行操作,脚本语句如下: 举例:例如你在测试服务器上想要查询业务库里的数据信息,此脚 ...
- matlab 第五章单元数组、字符串作业
1.创建 2×2 单元数组,第 1.2 个元素为字符串,第三个元素为整型变量,第四个元素为双精度(double)类型,并将其用图形表示. A=cell(2,2); A(1,1)={'mat'}; A( ...
- 2020CCPC长春题解 I - Kawaii Courier
2020CCPC长春题解 I - Kawaii Courier 题目大意:给一个树,让你求每个节点走到根节点的期望的d*x^d,d为走过的边个数.走法是每次随机等概率走到相邻的点. 题目分析: 相对于 ...
- 【鸿蒙开发板试用报告】用OLED板实现FlappyBird小游戏(上)
总是做各种Demo,是时候做个什么小应用来练练手了.踌躇了很久,果然还是搞个小游戏才有意思.想到几年前风靡全球的FlappyBird,一个屏幕一个按钮就足够了,正好适合.OLED屏幕.按键的驱动已经有 ...
- FTP的PORT(主动模式)和PASV(被动模式)
最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同.在此重温一下FTP的 ...
- NAT基本原理及应用
参考链接 https://blog.csdn.net/u013597671/article/details/74275852
- python笔记(1)---数据类型
数据类型 基本的五大数据类型 对python中的变量有如下的五种基本的数据类型: Number数字 list列表 Tuple元组 string字符串 Dictionary字典 1.Number [注意 ...
- 阿里面试官:你连个java多线程都说不清楚,我招你进来干什么
创建线程的方法 继承Thread类 继承Thread类,重写run方法,通过线程类实例.start()方法开启线程. public class TestThread1 extends Thread{ ...
- MathType输入几何符号的技巧
通过学习几何学的知识,我们发现其中包含的几何符号有很多,比如有表示图形的符号,如三角形,平行四边形,圆,角,圆弧等:还有表示位置关系的符号,如平行,垂直等:还有表示矢量等其他符号,那么MathType ...
- 删除list列表中的某一个元素的多种方法
当我们在处理业务的时候,很多情况下数据都要进行一层层的过滤,最近需要给一个列表中去除不符合条件的元素, 本来觉着挺简单的,Google了下发现很多方法都是旧方法,根本不符合我的需求. 于是参考着网上的 ...