pos=nameList[i].namenum%HashNum_L;
count=2;
if(HashList_L[pos].pos==0){
//printf("\nthefirstif");
HashList_L[pos].data=nameList[i];
HashList_L[pos].pos=1;
HashList_L[pos].next=NULL;
//printf("——————不冲突!
");
}
else{
p=&HashList_L[pos];
while(p->next!
=NULL){
p=p->next;
count++;
printf("冲突了!
");
}
q=(Hash_P)malloc(sizeof(Hash_L));
q->next=p->next;
p->next=q;
q->data=nameList[i];
q->pos=count;
//printf("\n冲突了%d次的人是%s\n",count,nameList[i].name);
}
}
printf("初始化完毕!
");
}
哈希表查找:
voidfindName_X(){
charfname[20]={0};
intfindNum=0,fhashNum=0,d;
printf("请输入学要查找的姓名(一小写拼音的形式):
");
scanf("%s",fname);
for(intm=0;m<20;m++)
findNum+=fname[m];
printf("\nfindNumis:
%d\n",findNum);
fhashNum=findNum%HashNum;
if(HashList[fhashNum].data.namenum==0)printf("该姓名不存在!
");
elseif(HashList[fhashNum].data.namenum==findNum)printf("该学生姓名为:
%s\n该学生关键字为:
%d\n该学生位置为:
%d\n查找该学生冲突次数:
%d\n",
HashList[fhashNum].data.name,HashList[fhashNum].data.namenum,fhashNum,HashList[fhashNum].pos);
else{
d=fhashNum;
while(HashList[d].data.namenum!
=findNum){
d=(d+1)%HashNum;
}
printf("该学生姓名为:
%s\n该学生关键字为:
%d\n该学生位置为:
%d\n查找该学生冲突次数:
%d\n",
HashList[d].data.name,HashList[d].data.namenum,d,HashList[d].pos);
}
}
voidfindName_T(){
charfname[20]={0};
intfindNum=0,fhashNum=0,d,k=0;
printf("请输入学要查找的姓名(一小写拼音的形式):
");
scanf("%s",fname);
for(intm=0;m<20;m++)
findNum+=fname[m];
printf("\nfindNumis:
%d\n",findNum);
fhashNum=findNum%HashNum;
if(HashList[fhashNum].data.namenum==0)printf("该姓名不存在!
");
elseif(HashList[fhashNum].data.namenum==findNum)printf("该学生姓名为:
%s\n该学生关键字为:
%d\n该学生位置为:
%d\n查找该学生冲突次数:
%d\n",
HashList[fhashNum].data.name,HashList[fhashNum].data.namenum,fhashNum,HashList[fhashNum].pos);
else{
d=fhashNum;
while(HashList[d].data.namenum!
=findNum){
d=(d+dup[k++]+HashNum)%HashNum;
}
printf("该学生姓名为:
%s\n该学生关键字为:
%d\n该学生位置为:
%d\n查找该学生冲突次数:
%d\n",
HashList[d].data.name,HashList[d].data.namenum,d,HashList[d].pos);
}
}
voidfindName_L(){
charfname[20]={0};
intfindNum=0,fhashNum=0,pos;
Hash_Pp;
printf("请输入学要查找的姓名(一小写拼音的形式):
");
scanf("%s",fname);
for(intm=0;m<20;m++)
findNum+=fname[m];
printf("\nfindNumis:
%d\n",findNum);
pos=findNum%HashNum_L;
p=&HashList_L[pos];
if(!
p)printf("改姓名不存在!
");
while(p&&p->data.namenum!
=findNum)p=p->next;
if(p->data.namenum==findNum){
printf("该学生姓名为:
%s\n该学生关键字为:
%d\n该学生位置为:
%d\n查找该学生冲突次数:
%d\n",
p->data.name,p->data.namenum,pos,p->pos);
}
}
四、【测试结果(Testing)】(10%)
(本部分应包括:
对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)
截图如下:
五、【实验总结】(10%)
(本部分应包括:
自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)
这次实验使我对Hash查找表、Hash搜索算法有了熟练的掌握。
在设计程序时,摆在我面前有以下几个难题:
首先,如何用C#生成符合一定规则的HashTable?
这个问题花了我不少时间,最后通过定义一个结构体数组来避免指针的缺失,解决了此问题。
其次,在生成HashTable之后,如何实现HashTable搜索算法呢?
我觉得还是继续使用哈希法推算index,如果不符合要求则继续使用再哈希法,直至达到符合要求的表项或者条件出错退出。
利用哈希法选择index能够很有效的减少堆积,降低平均查找长度,实现快速存取的目的。
本次试验,有些同学帮助我很多,一起讨论并解决了不少问题,使得程序更佳完善。
一个人不可能面面俱到,这时同学的帮助与合作尤为重要,一定要虚心求教,认真倾听别人的意见,不要认为自己做的东西才是最好的,只有这样才能进步。
六、思考题(10%)
(注:
选择C难度的才需要填写“项目运作描述”,其他难度的只需完成思考题)
(项目运作描述应包括:
项目的成本效益分析,应用效果等)
我所设计的这个程序可以实现对动态查找表中的二叉排序树的建立与查找,包括新结点的插入和删除等操作。
通过哈希表的构造、查找和维护,能够对学生进行按姓名的哈希查找。
七、【代码】(10%)
(本部分应包括:
完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体:
Georgia,行距:
固定行距12,字号:
小五)
#include
#include
#include
#include
#include
#defineNameNum30
#defineHashNum50
#defineHashNum_L17
#definedupSize15
typedefintKeyType;
typedefstruct{
constchar*name;
intnamenum;
}Name;
typedefstruct{
Namedata;
intpos;
}HashTable;
typedefstructHash{
Namedata;
intpos;
structHash*next;
}*Hash_P,Hash_L;
typedefstructBSTNode{
KeyTypekey;
structBSTNode*lc,*rc;
}*BSTree;
voidInsertBST(BSTree*bst,KeyTypekey)//若在二叉排序树中不存在关键字等于key的元素,插入该元素
{
BSTrees;
if(*bst==NULL)//递归结束条件
{
s=(BSTree)malloc(sizeof(BSTNode));
s->key=key;
s->lc=NULL;
s->rc=NULL;
*bst=s;
}
elseif(key<(*bst)->key)
InsertBST(&((*bst)->lc),key);//将s插入左子树
elseif(key>(*bst)->key)
InsertBST(&((*bst)->rc),key);//将s插