以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  请教高手:构造哈希表  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=42040)


--  作者:zyc_1999
--  发布时间:1/7/2007 1:12:00 PM

--  请教高手:构造哈希表
已知一个英文单词的序列,要求对其建立哈希表ht,哈希函数h(key)为关键字的第一个字母在字母表中的序号,哈希表的长度为m,其装填因子小于1,处理冲突的方法为线性探测再散列法.编写一个建立哈希表的程序.(用C/C++语言)

--  作者:zyc_1999
--  发布时间:1/7/2007 5:43:00 PM

--  
请大家帮帮忙啊~
--  作者:卷积内核
--  发布时间:1/9/2007 8:31:00 AM

--  
好长时间没看数据结构了,哈希表和线性探测再散列法什么的都忘了。
--  作者:一分之千
--  发布时间:1/9/2007 8:58:00 AM

--  
给你看看这个例子的,不太一样,参考下吧~
====================
#include <stdio.h>
#include<conio.h>
#include<string.h>
//#include<windows.h>

#define HASH_LEN 50                     //哈希表的长度         
#define M 47                            
#define NAME_NO 30                     //人名的个数        

typedef struct NAME       
{
 char *py;   //名字的拼音
 int k;      //拼音所对应的整数
}NAME;
NAME NameList[HASH_LEN];                 


typedef struct  hterm    //哈希表
{
 char *py;  //名字的拼音
 int k;     //拼音所对应的整数
 int si;    //查找长度
}HASH;
HASH HashList[HASH_LEN];                            

/*-----------------------姓名(结构体数组)初始化---------------------------------*/
void InitNameList()               
{
 NameList[0].py="chenghongxiu";
 NameList[1].py="yuanhao";
 NameList[2].py="yangyang";
 NameList[3].py="zhanghen";
 NameList[4].py="chenghongxiu";
 NameList[5].py="xiaokai";
 NameList[6].py="liupeng";
 NameList[7].py="shenyonghai";
 NameList[8].py="chengdaoquan";
 NameList[9].py="ludaoqing";
 NameList[10].py="gongyunxiang";
 NameList[11].py="sunzhenxing";
 NameList[12].py="sunrongfei";
 NameList[13].py="sunminglong";
 NameList[14].py="zhanghao";
 NameList[15].py="tianmiao";
 NameList[16].py="yaojianzhong";
 NameList[17].py="yaojianqing";
 NameList[18].py="yaojianhua";
 NameList[19].py="yaohaifeng";
 NameList[20].py="chengyanhao";
 NameList[21].py="yaoqiufeng";
 NameList[22].py="qianpengcheng";
 NameList[23].py="yaohaifeng";
 NameList[24].py="bianyan";
 NameList[25].py="linglei";
 NameList[26].py="fuzhonghui";
 NameList[27].py="huanhaiyan";
 NameList[28].py="liudianqin";
 NameList[29].py="wangbinnian";
 
 char *f;
 int r,s0;
 
 for (int i=0;i<NAME_NO;i++)   //求出各个姓名的拼音所对应的整数
 {
  s0=0;
  f=NameList[i].py;
  
  for (r=0;*(f+r) != '\0';r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
   s0=*(f+r)+s0;
  
  NameList[i].k=s0;
 } 
}

/*-----------------------建立哈希表---------------------------------*/
void CreateHashList()    
{
 for (int i=0; i<HASH_LEN;i++)       //哈希表的初始化
 {
  HashList[i].py="";
  HashList[i].k=0;
  HashList[i].si=0;
 }
 
 for (i=0;  i<NAME_NO;  i++)       
 {
  int sum=0;
  int adr=(NameList[i].k) % M;    //哈希函数
  int d=adr;
  if(HashList[adr].si==0)        //如果不冲突
  {
   HashList[adr].k=NameList[i].k;
   HashList[adr].py=NameList[i].py;
   HashList[adr].si=1;
  }
  else   //冲突  
  {
   do
   {
    d=(d+((NameList[i].k))%10+1)%M;  //伪散列    
    sum=sum+1;  //查找次数加1    
   }while (HashList[d].k!=0);
   
   HashList[d].k=NameList[i].k;
   HashList[d].py=NameList[i].py;
   HashList[d].si=sum+1;
  }
 }
}


/*-------------------------------------查找------------------------------------*/
void  FindList()     

 printf("\n\n请输入姓名的拼音:   ");    //输入姓名
 char name[20]={0}; 
 scanf("%s",name); 
 
 int s0=0;
 for (int r=0;r<20;r++)    //求出姓名的拼音所对应的整数(关键字)
  s0+=name[r]; 
 
 int sum=1;
 int adr=s0 % M;  //使用哈希函数
 int d=adr;
 
 if(HashList[adr].k==s0)         //分3种情况进行判断
  printf("\n姓名:%s  关键字:%d  查找长度为: 1",HashList[d].py,s0); 
 else if (HashList[adr].k==0)
  printf("无该记录!");
 else
 {
  int g=0;
  do
  {
   d=(d+s0%10+1)%M;      //伪散列                       
   sum=sum+1;
   if (HashList[d].k==0)
   {
    printf("无记录! ");  
    g=1;     
   }
   if (HashList[d].k==s0)
   {    
    printf("\n姓名:%s  关键字:%d  查找长度为:%d",HashList[d].py,s0,sum); 
    g=1;  
   }
  }while(g==0);   
 }  
}


/*--------------------------------显示哈希表----------------------------*/
void  Display()         
{
   printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音 \n"); //显示的格式

 for(int i=0; i<15; i++)
 {
  printf("%d ",i); 
  printf("\t%d ",HashList[i].k);
  printf("\t\t%d ",HashList[i].si);
  printf("\t\t%d ",(HashList[i].k)%M);
  printf("\t %s ",HashList[i].py);
  printf("\n");
 }

 printf("按任意键继续显示...\n");  //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)
 getch();
 for( i=15; i<30; i++)
 {
  printf("%d ",i); 
  printf("\t%d ",HashList[i].k);
  printf("\t\t%d ",HashList[i].si);
  printf("\t\t%d ",(HashList[i].k)%M);
  printf("\t %s ",HashList[i].py);
  printf("\n");
 }

 printf("按任意键继续显示...\n");
 getch();
 for( i=30; i<40; i++)
 {
  printf("%d ",i); 
  printf("\t%d ",HashList[i].k);
  printf("\t\t%d ",HashList[i].si);
  printf("\t\t%d ",(HashList[i].k)%M);
  printf("\t %s ",HashList[i].py);
  printf("\n");
 }

 printf("按任意键继续显示...\n");
 getch();
 for( i=40; i<50; i++)
 {
  printf("%d ",i); 
  printf("\t%d ",HashList[i].k);
  printf("\t\t%d ",HashList[i].si);
  printf("\t\t%d ",(HashList[i].k)%M);
  printf("\t %s ",HashList[i].py);
  printf("\n");
 }
 
 float average=0;
 for (i=0;i<HASH_LEN;i++)
  average+=HashList[i].si; 
 average/=NAME_NO;
 printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average); 
}


/*--------------------------------主函数----------------------------*/
void main()
{
/*  ::SetConsoleTitle("哈希表操作");       //Windows API函数,设置控制台窗口的标题
 HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄
 ::SetConsoleTextAttribute(hCon, 10|0);   //设置文本颜色
*/
 printf("\n------------------------哈希表的建立和查找----------------------");
 InitNameList();                                
 CreateHashList ();                        
 
 while(1)
 {
  printf("\n\n");
  printf("    1. 显示哈希表\n"); 
  printf("    2. 查找\n"); 
  printf("    3. 退出\n");
  
err:  
  char ch1=getch();
  if (ch1=='1')  
   Display();   
  else if (ch1=='2') 
   FindList();
  else if (ch1=='3') 
   return;
  else
  {
   printf("\n请输入正确的选择!");
   goto err;
  }
 }
}


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
8,671.875ms