【數據結構-查找】哈希表的應用

#include
#include<conio.h>
#define HASH_LEN 50                      //哈希表的長度         
#define M 47                            //隨機數
#define NAME_NO 30                      //人名的個數        




typedef struct


{
char *py;    //名字的拼音
int k;       //拼音所對應的整數
}NAME;


NAME NameList[HASH_LEN];    //全局變量NAME             


typedef struct    //哈希表
{


char *py;   //名字的拼音
int k;      //拼音所對應的整數
int si;     //查找長度
}HASH;


HASH HashList[HASH_LEN];        //全局變量HASH                     


void InitNameList() //姓名(結構體數組)初始化          


{


char *f;


int r, s0, i;


NameList[0].py = "wanghui";


NameList[1].py = "mayuelong";


NameList[2].py = "chenzhicheng";


NameList[3].py = "sunpeng";


NameList[4].py = "zengqinghui";


NameList[5].py = "liqingbo";


NameList[6].py = "liujunpeng";


NameList[7].py = "jiangquanlei";


NameList[8].py = "xingzhengchuan";


NameList[9].py = "luzhaoqian";


NameList[10].py = "gaowenhu";


NameList[11].py = "zhuhaoyin";


NameList[12].py = "chenlili";


NameList[13].py = "wuyunyun";


NameList[14].py = "huangjuanxia";


NameList[15].py = "wangyan";


NameList[16].py = "zhoutao";


NameList[17].py = "jiangzhenyu";


NameList[18].py = "liuxiaolong";


NameList[19].py = "wangziming";


NameList[20].py = "fengjunbo";


NameList[21].py = "lilei";


NameList[22].py = "wangjia";


NameList[23].py = "zhangjianguo";


NameList[24].py = "zhuqingqing";


NameList[25].py = "huangmin";


NameList[26].py = "haoyuhan";


NameList[27].py = "zhoutao";


NameList[28].py = "zhujiang";


NameList[29].py = "lixiaojun";


for (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() //建立哈希表   


{
int i;


for (i = 0; i<HASH_LEN; i++)


{


HashList[i].py = "";


HashList[i].k = 0;


HashList[i].si = 0;


}


for (i = 0; i<HASH_LEN; 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() //查找    


{


char name[20] = { 0 };


int s0 = 0, r, sum = 1, adr, d;


printf("\n請輸入姓名的拼音:");


scanf("%s", name);


for (r = 0; r<20; r++)   //求出姓名的拼音所對應的整數(關鍵字)


s0 += name[r];


adr = s0%M;   //使用哈希函數
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() // 顯示哈希表       


{
int i;


float average = 0;


printf("\n\n地址\t關鍵字\t\t搜索長度\tH(key)\t 姓名\n"); //顯示的格式


for (i = 0; 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");


}


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()


{


char ch1;


printf("\n                           哈希表的建立和查找\n");


printf("               *-------------------------------------------*\n");


printf("               |              D. 顯示哈希表                |\n");


printf("               |              F. 查找                      |\n");


printf("               |              Q. 退出                      |\n");


printf("               *-------------------------------------------*\n");




InitNameList();


CreateHashList();


while (1)


{


printf("\n       Option-:");


fflush(stdin);


ch1 = getchar();


if (ch1 == 'D' || ch1 == 'd')


Display();


else if (ch1 == 'F' || ch1 == 'f')


FindList();


else if (ch1 == 'Q' || ch1 == 'q')


return;


else


{


printf("\n請輸入正確的選擇!");


}
}

}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章