解决哈希冲突
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解决哈希冲突
一、需求分析
1、本程序由用户输入运行命令和数据,运行结果显示在其后。
2、程序执行的命令包括:
1)输入相关信息,构造一个指针型向量;2)输入数据,保存在哈希表中;3)输出用链地址法解决哈希冲突的结果。
2、测试数据
输入:T N M(T 表示hash表空间,N表示Hash函数的模,输入的数据个数)8 6 5
输入的数据:7,13,10,16,22
二、概要设计
#include
using namespace std;
struct Chain
{
int m;
Chain *next;
};
int T,M,N;
int key(int m,int n)
{
return m%n;
}
void create(Chain ChainHash[],int T,int M,int N)
{
Chain *p;
p=new Chain;
cout<<"输入数据:\n";
for(int i=0;i { Chain *q=new Chain;q->next=NULL; cin>>q->m; if(ChainHash[key(q->m,N)].next!=NULL) { p=&ChainHash[key(q->m,N)]; while(p->next!=NULL){p=p->next;} p->next=q; } else{ChainHash[key(q->m,N)].next=q;} } } void out_put(Chain a) { Chain *p=a.next; if(p==NULL) {cout<<"^"< else { while(p!=NULL) { cout<<"->"< p=p->next; } cout< } } void output(Chain a[],int T) { for(int i=0;i { cout< out_put(a[i]); } } void main() { int T=0,M=0,N=0;Chain ChainHash[30]; cout<<"输入Hash表空间:T=";cin>>T; cout<<"输入Hash函数的模:N=";cin>>N; cout<<"输入的数据个数M=";cin>>M; for(int i=0;i { ChainHash[i].next=NULL; } create(ChainHash,T,M,N); output(ChainHash,T); cout<<"ASL=(1*2+2*2+3)/M="<<(1*2+2*2+3)/M< } 四、调试分析 在编写时程序时,没有认真考虑链表的连接问题,总是出现链表连不上的情况。经过调试分析后,我终于找到了问题的所在。不但解决了问题,同时还加深了我对链表存储结构的理解。还有,在编写的时候,对于用链地址法解决哈希冲突是第一次,所以刚开始不知该如何下手。之后,经过查资料和认真分析,终于找到了方法。 五、运行结果 六、实验环境 (1)Windows 7系统下 (2)编程环境:VC6.0++ ,TC2.0