数据结构哈希表,求大神,急急急
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构哈希表,求大神,急急急相关的知识,希望对你有一定的参考价值。
对以下关键字序列建立哈希表16,29,45,37,58,55,49,26,50,24,36,38,要求填充率为80%,用二次探测再散列法处理冲突:请给出哈希函数,画出此哈希表,并计算在等概率情况下查找成功的平均查找长度
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define MAXSIZE 20
#define MAX_SIZE 20 //人名的最大长度
#define HASHSIZE 60 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
typedef int Status; //为现有类型添加一个同义字
typedef char NA[MAX_SIZE]; // typedef 掩饰数组类型
typedef struct //记录
NA name;
NA xuehao; //关键字
NA tel;
Stu; //查找表中记录类型
typedef struct //建立哈希表
Stu *elem[HASHSIZE]; //数据元素存储基址
int cou; //当前数据元素个数
int siz; //当前容量
HashTable;
Status eq(NA x,NA y)
if(strcmp(x,y)==0)
return SUCCESS;
else return UNSUCCESS;
Status NUM_BER; //记录的个数 全局变量
Status NUM_BER1;
void Create(Stu* a) //创建新的通讯录
system("CLS"); //调用DOS命令CLS能够清屏
int i;
FILE *fp1,*fp2;
if((fp1=fopen("record.txt","r"))!=NULL) //打开文件
fclose(fp1); //关闭文件
else
fp2=fopen("record.txt","w"); //如果不存在,就创建一个record.txt
fclose(fp2);
printf("\n输入要添加的个数:\n");
scanf("%d",&NUM_BER);
for(i=0;i<NUM_BER;i++)
printf("请输入第%d个记录的姓名:\n",i+1);
scanf("%s",a[i].name);
printf("请输入%d个记录的学号:\n",i+1);
scanf("%s",a[i].xuehao);
printf("请输入第%d个记录的电话号码:\n",i+1);
scanf("%s",a[i].tel);
getchar();
printf("添加成功!!!\n");
void getin(Stu * a) //录入通讯录的内容,传入一个record的指针,然后针对这个指针指向的内存记录进行操作
int i;
system("cls"); //调用DOS命令CLS能够清屏
printf("输入要添加的个数:\n");
scanf("%d",&NUM_BER);
for(i=0;i<NUM_BER;i++)
printf("请输入第%d个记录的姓名:\n",i+1);
scanf("%s",a[i].name);
printf("请输入%d个记录的学号:\n",i+1);
scanf("%s",a[i].xuehao);
printf("请输入第%d个记录的电话号码:\n",i+1);
scanf("%s",a[i].tel);
void output(Stu* a) //显示输入的用户信息
int i;
system("cls");
printf(" \n姓名\t学号\t\t电话号码");
for( i=0;i<NUM_BER;i++)
printf("\n%s\t%s\t\t%s",a[i].name,a[i].xuehao,a[i].tel);
int Hash(NA name)
int i,m;
i = 1;
m=(int)name[0];//强制转化成数字
while(name[i]!='\0')
m+=(int)name[i];
i++;
m=m%HASHSIZE;
return m;
Status collision(int p,int c) //冲突处理函数,采用二次探测法解决冲突 //二次探测法处理冲突
int i,q;
i=c/2+1;
while(i<HASHSIZE)
if(c%2==0)
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0) return q;
else i=c/2+1;
else
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;
return UNSUCCESS;
void CreateHash(HashTable* H,Stu* a) //建表,以人的姓名为关键字,建立相应的哈希表
int i,p=-1,c,pp;
system("cls");//若哈希地址冲突,进行冲突处理
for(i=0;i<NUM_BER+NUM_BER1;i++)
c=0;
p=Hash(a[i].name);
pp=p;
while(H->elem[pp]!=NULL)
pp=collision(p,c); //若哈希地址冲突,进行冲突处理
if(pp<0)
printf("第%d记录无法解决冲突",i+1); //需要显示冲突次数时输出
continue; //无法解决冲突,跳入下一循环
H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入
H->cou++;
printf("第%d个记录冲突次数为%d。\n",i+1,c);
printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->cou);
void SearchHash(HashTable* H,int c) //在通讯录里查找姓名关键字,c用来记录冲突次数,若查找成功,显示信息
int p,pp;NA NAME;
system("cls");
printf("\n请输入要查找记录的姓名:\n");
scanf("%s",NAME);
p=Hash(NAME);
pp=p;
while((H->elem[pp]!=NULL)&&(eq(NAME,H->elem[pp]->name)==-1))
pp=collision(p,c);
if(H->elem[pp]!=NULL&&eq(NAME,H->elem[pp]->name)==1)
printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n\n",c);
printf("姓名:%s\n学号:%s\n电话号码:%s\n",H->elem[pp]->name,H->elem[pp]->xuehao,H->elem[pp]->tel);
else printf("\n此人不存在,查找不成功!\n");
void Modify(HashTable* H,int c) //在通讯录里修改某人信息
int p,pp;NA NAME;
system("cls");
printf("\n请输入要修改记录的姓名:\n");
scanf("%s",NAME);
p=Hash(NAME);
pp=p;
while((H->elem[pp]!=NULL)&&(eq(NAME,H->elem[pp]->tel)==-1))
pp=collision(p,c);
if(H->elem[pp]!=NULL&&eq(NAME,H->elem[pp]->tel)==1)
printf("\n以下是您需要修改的信息:");
printf("姓名:%s\n学号:%s\n电话号码:%s\n",H->elem[pp]->name,H->elem[pp]->xuehao,H->elem[pp]->tel);
(H->elem)[pp]->tel[0]='\0';
printf("请输入修改后记录的姓名:\n");
scanf("%s",H->elem[pp]->name);
printf("请输入修改后记录的学号:\n");
scanf("%s",H->elem[pp]->xuehao);
printf("请输入修改后记录的电话号码:\n");
scanf("%s",H->elem[pp]->tel);
printf("修改成功!");
else
printf("\n此人不存在,修改不成功!\n");
void Delete(HashTable* H,int c) //在通讯录里查找姓名关键字,若查找成功,显示信息然后删除
int m,p,pp;NA str;
m=0;
system("cls");
printf("\n请输入要删除记录的姓名:\n");
m++;
scanf("%s",str);
p=Hash(str);
pp=p;
while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))
pp=collision(p,c);
if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1)
printf("\n以下是您需要要删除的信息:\n\n",c);
printf("姓名:%s\n学号:%s\n电话号码:%s\n",H->elem[pp]->name,H->elem[pp]->xuehao,H->elem[pp]->tel);
(H->elem)[pp]->name[0]='\0';
printf("删除成功!!!");
else
printf("\n此人不存在,删除不成功!\n");
void Save(HashTable * H) //将记录保存到指定文件
system("CLS");
int i;
FILE* fp;
if((fp=fopen("record.txt","w"))!=NULL)
fprintf(fp,"==================== 班级通讯录 ===================\n");
for(i=0;i<HASHSIZE;i++)
if((H->elem)[i]!='\0')
fprintf(fp,"学生姓名:%s\n",H->elem[i]->name);
fprintf(fp,"学生学号:%s\n",H->elem[i]->xuehao);
fprintf(fp,"学生电话号码:%s\n",H->elem[i]->tel);
fprintf(fp,"***********************************************\n");
fclose(fp);
printf("==================== 班级通讯录 ===================\n");
printf("\n\n恭喜你!!成功储存,你能在record.txt找到相应纪录\n");
system("pause");
else
printf("抱歉,保存记录失败!!");
system("pause");
int main()
Stu a[MAXSIZE];
int c,flag=1,i=0;
HashTable *H;
H=(HashTable*)malloc(sizeof(HashTable));
for(i=0;i<HASHSIZE;i++)
H->elem[i]=NULL;
H->siz=HASHSIZE;
H->cou=0;
while (1)
int num;
printf("\n");
printf("\n***************************班级通讯录****************************");
printf("\n* 【1】. 创建用户信息 *");
printf("\n* 【2】. 添加用户信息 *");
printf("\n* 【3】. 显示所有用户信息 *");
printf("\n* 【4】. 以姓名建立哈希表(二次探测法解决冲突)*");
printf("\n* 【5】. 查找用户信息 *");
printf("\n* 【6】. 删除用户信息 *");
printf("\n* 【7】. 修改用户信息 *");
printf("\n* 【8】. 保存 *");
printf("\n* 【9】. 退出程序 *");
printf("\n*****************************************************************");
printf("\n");
printf("\n* 温馨提示: *");
printf("\n* 进行4、5、6操作前 请先输出3 *");
printf("\n*****************************************************************");
printf("\n请输入一个任务选项>>>");
printf("\n");
scanf("%d",&num);
switch(num)
case 1:Create(a) ;break;
case 2:getin(a); break;
case 3:output(a); break;
case 4:CreateHash(H,a); break;
case 5:c=0;SearchHash(H,c); break;
case 6:c=0;Delete(H,c); break;
case 7:c=0;Modify(H,c); break;
case 8:Save(H); break;
case 9:return 0; break;
default:
printf("输入错误,请重新输入!");
printf("\n");
system("pause");
return 0;
参考技术A 要是有钱就好使了。追问
你要多少,我给你烧。。
追答呵呵
参考技术B 不会。。。。。。。。。。。。。。。以上是关于数据结构哈希表,求大神,急急急的主要内容,如果未能解决你的问题,请参考以下文章
请大神帮我看看为啥我这个简单的小爬虫得不到数据?急急急急急!!!
急急急 求大神帮忙 用vc++ 生成1024位大素数 用到米勒拉宾素性测试