# include & ltstdio.h & gt
# include & ltmalloc.h & gt
# include & ltstring.h & gt
//#包含
#define HASH_LEN 50 //哈希表的長度
#定義M 47
#定義名稱_編號30 //名稱數量
typedef結構名稱
{
char * py//姓名的拼音
int k;//拼音對應的整數
}姓名;
NAME NAME list[HASH _ LEN];
Typedef結構hterm //哈希表
{
char * py//姓名的拼音
int k;//拼音對應的整數
int si//查找長度
}哈希;
HASH HashList[HASH _ LEN];
/* - name(結構數組)初始化。
void InitNameList()
{
名稱列表[0]。py = " chenghongxiu
姓名列表[1]。py= "元昊";
名單[2]。py= "楊洋";
名單[3]。py = " zhanghen
名單[4]。py = " chenghongxiu
名單[5]。py= "肖凱";
名單[6]。py= "劉鵬";
名單[7]。py= "申永海";
名單[8]。py= "成道全";
名單[9]。py = " ludaoqing
名單[10]。py= "貢雲祥";
名單[11]。py= "孫振興";
名單[12]。py= "孫榮飛";
名單[13]。py= "孫明龍";
名單[14]。py= "張浩";
名單[15]。py= "田渺";
名單[16]。py= "姚建中";
名單[17]。py = " yaojianqing
名單[18]。py= "姚建華";
名單[19]。py= "姚海峰";
名單[20]。py = " chengyanhao
姓名列表[21]。py= "耀秋風";
名單[22]。py= "錢鵬程";
名單[23]。py= "姚海峰";
名單[24]。py = " bianyan
名單[25]。py= "雷淩";
名單[26]。py= "福中會";
名單[27]。py = " huanhaiyan
名單[28]。py = " liudianqin
名單[29]。py= "王斌年";
char * f;
int r,s0;
for(int I = 0;我& ltNAME _ NOI++)//找到每個名字的拼音對應的整數。
{
s0 = 0;
f =名稱列表[i]。py;
for(r = 0;*(f+r)!= '\0';R++) //方法:將字符串每個字符對應的ASCII碼相加,得到的整數作為哈希表的鍵。
s0 = *(f+r)+s0;
名單[i]。k = s0
}
}
/* -構建哈希表*/
void CreateHashList()
{
for(int I = 0;我& lt哈希_長度;I++)//哈希表的初始化
{
HashList[i]。py =
HashList[i]。k = 0;
HashList[i]。si = 0;
}
for(I = 0;我& ltNAME _ NO)
{
int sum = 0;
int adr=(NameList[i]。k)% M;//哈希函數
int d = adr
If(HashList[adr].si==0) //如果沒有沖突,
{
HashList[adr]。k =名稱列表[i]。k;
HashList[adr]。py=NameList[i]。py;
HashList[adr]。si = 1;
}
Else //沖突
{
做
{
d=(d+((名稱列表[i])。k))% 10+1)% M;//偽哈希
sum = sum+1;//搜索次數加1
}while (HashList[d].k!=0);
HashList[d]。k =名稱列表[i]。k;
HashList[d]。py=NameList[i]。py;
HashList[d]。si = sum+1;
} i++;
}
}
/* -搜索。
void FindList()
{
printf(" \ n \ n請輸入您姓名的拼音:");//輸入壹個名稱
char name[20]= { 0 };
scanf("%s ",名稱);
int s0 = 0;
for(int r = 0;r & lt20;R++) //查找姓名拼音對應的整數(關鍵字)。
s0+= name[r];
int sum = 1;
int ADR = s0 % M;//使用哈希函數
int d = adr
If(HashList[adr].k==s0) //分三種情況判斷。
printf(" \ n名稱:%s關鍵字:%d搜索長度:1 ",HashList[d]。py,s0);
else if (HashList[adr].k==0)
Printf("沒有這樣的記錄!");
其他
{
int g = 0;
做
{
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);
}
}
/* -顯示哈希表。
空顯示()
{
printf(" \ n \ n address \ t key word \ t \ t搜索長度\ th(key)\ t \ t pinyin \ n ");//顯示格式
for(int I = 0;我& lt15;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;我& lt30;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;我& lt40;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;我& lt50;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 ");
}
浮動平均值= 0;
for(I = 0;我& lt哈希_長度;i++)
average+=HashList[i]。si;
average/= NAME _ NO;
printf(" \ n \ n平均搜索長度:ASL (%d) =% f \ n \ n ",name _ no,average);
}
/* -主函數。
void main()
{
/*::setconsolettitle("哈希表操作");//Windows API函數來設置控制臺窗口的標題。
HANDLE hCon =::GetStdHandle(STD _ OUTPUT _ HANDLE);//獲取標準輸出設備的句柄
* SetConsoleTextAttribute(hCon,10 | 0);//設置文本顏色
*/
Printf ("\ n -哈希表的建立和搜索");
init name list();
create hashlist();
while(1)
{
printf(" \ n \ n ");
Printf(" 1。顯示哈希表\ n ");
Printf(" 2。查找\ n ");
Printf(" 3。退出\ n ");
錯誤:
char ch 1;
scanf("%c ",& ampch 1);
if (ch1=='1 ')
顯示();
else if (ch1=='2 ')
FindList();
else if (ch1=='3 ')
返回;
其他
{
printf(" \ n請輸入正確的選項!");
goto err
}
}
}