帮忙做做(哈希表的设计)

nh20111101 2013-03-13 05:10:47
问题描述:针对自己的班集体中的“人名”设计一个哈希表,完成相应的建表和查表程序。
基本要求
1.人名为中国姓名的汉语拼音形式
2.待填入哈希表的人名不低于30个
3.用链表法处理冲突
4.完成任意人名的查找并给出查找长度


以下是我照葫芦画瓢画的可是不对,帮忙看看!!!
原题是要求用链地址法解决冲突,如果能帮我改过来用这种方法更好,实在不行,帮我把这个调试运行成功也非常感激!!!!!·······

Name.h

#ifndef Name_H
#define Name_H
#include "HashTable.h"
#include <iostream>
using namespace std;
#define Length 40
int Num;
struct Name
{
void creatname(); //输入人名
char *s;
int k; //拼音所对应的长度,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
};

void Name::creatname()
{
Name *n;
char s[Length];
cout<<"Please input the quantity of saved people:";
cin>>Num;
cout<<"Please input the name of the person:"<<endl;
for(int i=0;i<Num;i++)
{
cout<<"the no."<<i+1<<" person:";
cin>>s;
}
for(int j=0;j<Num;j++)
{
int s0=0;
char *f;
f=n[j].s;
for(int r=0;*(f+r)!='\0';r++) /*将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/
s0=*(f+r)+s0;
n[j].k=s0;
}
}
#endif


Hash.h

#ifndef HASH_H
#define HASH_H
#include "Name.h"
#include <iostream>
using namespace std;
#define Size 40
int M=23;
class Hash
{
public:
void Creat();
void Find();
private:
char *s;
int k; //拼音所对应的长度
int count; //查找长度
};
void Hash::Creat()
{
Hash *h;
Name *n;
for(int i=0;i<Size;i++)
{
h[i].s="\0";
h[i].count=0;
h[i].k=0;
}
for(int j=0;j<Size;j++)
{
int sum=0;
int adr=(h[j].k)%M; //哈希函数
if(h[adr].count=0) //不冲突
{
h[adr].k=h[j].k;
h[adr].s=h[j].s;
h[adr].count=1;
}
else //冲突
{
while(h[adr].k!=0)
{
adr=(adr+n[j].k%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1; //查找次数加1
}
h[adr].k =n[j].k;
h[adr].s=n[j].s;
h[adr].count=sum+1;
}
}
}

void Hash::Find()
{
Hash *h;
char *name;
int s0=0,r,sum=1,adr,d;
cout<<"请输入姓名的拼音:"<<endl;
cin>>name;;
for(r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字)
s0+=name[r];
adr=s0%M; //使用哈希函数
d=adr;
if(h[adr].k==s0) //分3种情况进行判断
cout<<"姓名:"<<h[d].s<<" "<<"关键字:"<<s0<<" "<<"查找长度为: 1"<<endl;
else if (h[adr].k==0)
cout<<"无此记录!"<<endl;
else
{
int g=0;
while(g==0)
{
d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突
sum=sum+1;
if(h[d].k==0)
{
cout<<"无此记录!"<<endl;
g=1;
}
if(h[d].k==s0)
{
cout<<"姓名:"<<h[d].s<<" "<<"关键字:"<<s0<<" "<<"查找长度为:"<<sum<<endl;
g=1;
}
};
}
}
#endif



main.cpp

#include <iostream>
#include "HashTable.h"
#include "Name.h"
using namespace std;
int main()
{
Hash h;
Name n;
char x;
cout<<"c.输入姓名 f. 查找 任意键退出 请选择:"<<endl;
while(cin>>x)
{
if(x=='c')
{
n.creatname();
h.Creat();
}
if(x=='f')
{
h.Find();
cout<<endl;
}
else break;
}
return 0;
}


...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nh20111101 2013-03-13
  • 打赏
  • 举报
回复
高手,俺们这忙的课程设计急着要交,帮帮忙啦!!!
漫步者、 2013-03-13
  • 打赏
  • 举报
回复
how much money

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧