哈希表的创建,查找

来源:互联网 发布:杭州淘宝村在哪里 编辑:程序博客网 时间:2024/05/17 23:22


采用处留余数法对哈希表进行构造,利用线性探测再散列法来进行冲突处理.根据用户名字(用户名字各个字母的ASCII码值相加,其和作为关键字(key) 对用户进行查找。


#include <stdio.h>#include <stdlib.h>#include <string.h>#include<malloc.h> struct student{int key;const char *p;};struct HASH{    int key ;    int adrss;    int reha;    const char *m;    int l;   };struct student a[10];            //声明两个结构体数组 struct HASH b[20];void name_init()  {              a[0].p="liguohan";a[1].p="lilei";a[2].p="gechang";a[3].p="jiachao";a[4].p="liming";a[5].p="sunchouchou";a[6].p="yanghao";a[7].p="chenzhuoxin";a[8].p="mabiao";a[9].p="renyi";int i,j,k;for(i=0;i<10;i++)                     //用户name(结构体数组)初始化,用户名字各个字母ASCII                                                                                  码值相加,其和作为关键字(key)  {j=0;for(k=0;*(a[i].p+k)!='\0';k++){j+=*(a[i].p+k);a[i].key=j;}}}void HASH_init()                //哈希表初始化 {int n; for(n=0;n<20;n++) { b[n].key=0; b[n].adrss=0; b[n].reha=0; b[n].m=" "; b[n].l=0; }}void creat_HASH()                              //哈希表创建 {name_init();HASH_init();int i;int count=0;for(i=0;i<10;i++){int m=a[i].key%15;int n=(a[i].key+1)%15;                        //线性探测再散列函数if(b[m].l==0){b[m].key=a[i].key;b[m].adrss=a[i].key%15;b[m].reha=(a[i].key+1)%15;b[m].m=a[i].p;b[m].l=1;}else{int temp;int c=1;do{temp=(a[i].key+c)%15;m=temp;count=count+1;c++;}while(b[m].l!=0);b[m].key=a[i].key;b[m].adrss=a[i].key%15;b[m].reha=(a[i].key+1)%15;b[m].m=a[i].p;b[m].l=count+1;}}}void find_name()                                //根据用户名查找 {  char *s;  s=(char*)calloc(20,sizeof(char));  int key=0,k=0,i,j=1,adr;  printf("请输入用户名:");   scanf("%s",s);  for(i=0;*(s+i)!='\0';i++){k+=*(s+i);key=k;}  adr=key%15;  if(b[adr].key==key)  {  printf("关键字为:%d\n",key);  printf("初散列值为:%d\n",b[adr].adrss);  printf("再散列值为:%d\n",b[adr].reha);  printf("哈希地址为:%d\n",b[adr].adrss);  printf("表中位置为:%d\n",adr);  printf("查找长度为:%d\n",b[adr].l);  }    else if(b[adr].key==0)  {   printf("无此记录\n");  }  else  {        int sign=1;  while(sign)  {   int adr1;  adr1=(b[adr].key+j)%15;  adr=adr1;  if(b[adr].key==0)  {  sign=0;  printf("无此记录\n"); } else if(b[adr].key==key) { printf("关键字为:%d\n",key);  printf("初散列值为:%d\n",b[adr].adrss);  printf("再散列值为:%d\n",b[adr].reha);  printf("初散列值为:%d\n",b[adr].adrss);  printf("表中位置为:%d\n",adr);  printf("查找长度为:%d\n",b[adr].l);  break;                                                         //这个break要注意!               }  else j++;  }   }   } void print_HASH()                    //打印哈希表        {  int i;   printf("关键码  初散列 再散列 哈希地址 查找次数 姓名\n");  for(i=0;i<20;i++)  {  printf("%d\t%d\t%d\t%d\t%d\t%s\t\n",b[i].key,b[i].adrss,b[i].reha,i,b[i].l,b[i].m);}   }    int main() {    int temp;   creat_HASH();   print_HASH();   while(1)   {   find_name();   printf("继续请输入1,输入其他值退出:\n");   scanf("%d",&temp);   if(temp!=1)   break;   }


运行结果:


 

0 0