• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: C/C++
  • 标签: 哈希表  

资源简介

1)设计几个不同的哈希函数,比较他们的地址冲突率(可以用更大的名字集合做实验)。 (2)研究这30个人名的特点,努力找一个哈希函数,使得对于不同的拼音名一定不发生地址冲突。 (3)在哈希函数确定的前提下尝试各种不同处理冲突的方法,考察平均查找长度的变化和造好的哈希表中关键字的聚集性。

资源截图

代码片段和文件信息

#include
#include//time用到的头文件
#include//随机数srand用到的头文件
#include//toascii()用到的头文件
#include//查找姓名时比较字符串用的头文件
#define HASH_LEN 50//哈希表的长度
#define P 43//小于哈希表长度的P
#define NAME_LEN 30//姓名表的长度
int d[30] i j;
typedef struct
{
char name[20];
int  m;
}NAME;
typedef struct
{
char name[20];
int m;
int si;
}HASH;
NAME Name[HASH_LEN];
HASH Hash[HASH_LEN];
void InitName()
{  printf(“请输入姓名\n“); 
   for(i=0;i<30;i++){ 
   printf(“请输入第%d位姓名:“i+1);
   gets(Name[i].name); 


for(i=0;i int s=0;
for(int j=0;j<20;j++)//将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
{  
s=s+toascii(Name[i].name[j]); 
}
Name[i].m=s;}
}
void CreatHash()
{
 for(i=0;i       {
              Hash[i].name[20]=NULL;
              Hash[i].m =0;
              Hash[i].si=0;
       }
    for(i=0;i       {
              int sum=1j=0t;
              int adr=(Name[i].m)%P;  //除留余数法H(key)=key%P,除数为P=43
              if(Hash[adr].si==0)     //如果不冲突,将姓名表赋值给哈希表
              {
                     Hash[adr].m =Name[i].m;
                     strcpy(Hash[adr].nameName[i].name);
                     Hash[adr].si=1;
              }
              else                         //如果冲突
              {
                  t=adr;        //线性探测法处理冲突
                 for(;Hash[adr].si!=0&&adr                     {
                            sum=sum+1;//每次查找,查找次数+1
                            if(adr==HASH_LEN-1)//如果找到最后一个仍然没有位置
                            {
                                for(;Hash[adr].si!=0&&adr                                 sum=sum+1;//每次查找,查找次数+1
                                 if(adr==t) printf(“哈希表已满\n“);//如果找到上次的位置仍然没有,则输出哈希表已满
                            }
                     }
                     Hash[adr].m =Name[i].m;  //将姓名表复制给哈希表对应的位置上
                     strcpy(Hash[adr].nameName[i].name);
                     Hash[adr].si=sum;
              }
       }
}
void DisplayName()//显示姓名表
{
       printf(“\n地址 \t\t 姓名 \t\t 关键字\n“);
       for (i=0;i       printf(“%2d %18s \t\t  %d  \n“iName[i].nameName[i].m);
}
void DisplayHash()// 显示哈希表
{
       float asl=0.0;
       printf(“\n\n 地址 \t\t 姓名 \t\t 关键字 \t 搜索长度\n“); //显示的格式
       for (i=0;i       {
              printf(“%2d %1

评论

共有 条评论