?? 哈希表.cpp
字號:
#include<stdio.h>
#include<iostream>
#include<conio.h>
using namespace std;
#define HASH_LEN 50 //哈希表的長度
#define M 47 //隨機數
int NAME_NO=34; //城市名的個數
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="harbin";
NameList[1].py="shijiazhuang";
NameList[2].py="lanzhou";
NameList[3].py="kunming";
NameList[4].py="chengdu";
NameList[5].py="changchun";
NameList[6].py="shenyang";
NameList[7].py="xining";
NameList[8].py="xian";
NameList[9].py="zhengzhou";
NameList[10].py="jinan";
NameList[11].py="taiyuan";
NameList[12].py="hefei";
NameList[13].py="wuhan";
NameList[14].py="changsha";
NameList[15].py="nanjing";
NameList[16].py="guiyang";
NameList[17].py="nanning";
NameList[18].py="hangzhou";
NameList[19].py="nanchang";
NameList[20].py="guangzhou";
NameList[21].py="fuzhou";
NameList[22].py="taipei";
NameList[23].py="haikou";
NameList[24].py="huhhot";
NameList[25].py="yinchuan";
NameList[26].py="urumqi";
NameList[27].py="lahsa";
NameList[28].py="macau";
NameList[29].py="beijing";
NameList[30].py="shanghai";
NameList[31].py="hongkong";
NameList[32].py="tianjin";
NameList[33].py="chongqing";
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;
}
}
}
int 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);
cout<<endl;
return 0;
}
else if (HashList[adr].k==0)
{
printf("無此記錄!");
cout<<endl;
return 1;
}
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //偽隨機探測再散列法處理沖突
sum=sum+1;
if (HashList[d].k==0)
{
printf("無此記錄! ");
cout<<endl;
g=1;
return 1;
}
if (HashList[d].k==s0)
{
printf("\n名稱:%s 關鍵字:%d 查找長度為:%d",HashList[d].py,s0,sum);
cout<<endl;
g=1;
return 0;
}
}while(g==0);
}
}
void Display() // 顯示哈希表
{
int i;
float average=0;
for(i=0; i<HASH_LEN; i++)
{
if(HashList[i].k%M==0)
HashList[i].py="";
}
printf("\n\n地址\t關鍵字\t\t搜索長度\tH(key)\t 名稱\n"); //顯示的格式
for(i=0; i<HASH_LEN; 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);
//cout<<" "<<HashList[i].py<<endl;
printf("\n");
//cout<<i<<" "<<HashList[i].k<<" "<<HashList[i].si<<" "<<HashList[i].k%M<<" "<<HashList[i].py<<endl;
}
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 DeleteList()
{
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);
cout<<endl;
cout<<"刪除成功!"<<endl;
s0=0;
HashList[d].py=""; //名字的拼音
HashList[d].k=0; //拼音所對應的整數
HashList[d].si=0;
}
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);
cout<<endl;
cout<<"已刪除成功!"<<endl;
s0=0;
HashList[d].py=""; //名字的拼音
HashList[d].k=0; //拼音所對應的整數
HashList[d].si=0;
//Display();
g=1;
}
}while(g==0);
}
}
void EnterList()
{
/*char name[20]={0};
int s0=0,r,sum=1,adr,d,h;
printf("\n請輸入姓名的拼音:");
scanf("%s",name);
for (r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
s0+=name[r];*/
char st[20];
char *xin;
xin=st;
int s0=0,r,sum=1,adr,d,h;
printf("\n請輸入城市名稱的拼音:");
cin>>xin;
//cout<<xin<<endl;
for (r=0;*(xin+r)!='\0';r++)
{
/* 方法:將字符串的各個字符所對應的ASCII碼相加,所得的整數做為哈希表的關鍵字*/
s0=(int)(*(xin+r))+s0;
}
//cout<<s0<<endl;
adr=s0%M; //使用哈希函數
d=adr;
if(HashList[adr].k==s0) //分3種情況進行判斷
{
printf("\n名稱:%s 關鍵字:%d 查找長度為: 1",HashList[d].py,s0);
cout<<endl;
cout<<"已存在于表中,無需插入!"<<endl;
}
else if (HashList[d].k==0)
{
printf("插入成功!");
HashList[d].py=xin;
HashList[d].k=s0;
HashList[d].si=1;
h=1;
cout<<endl;
}
else
{
int g=0,h=0;
do
{
d=(d+s0%10+1)%M; //偽隨機探測再散列法處理沖突
sum=sum+1;
if (HashList[d].k==0)
{
printf("插入成功!");
HashList[d].py=xin;
HashList[d].k=s0;
HashList[d].si=sum;
h=1;
cout<<endl;
g=1;
}
if (HashList[d].k==s0)
{
printf("\n名稱:%s 關鍵字:%d 查找長度為:%d",HashList[d].py,s0,sum);
cout<<endl;
cout<<"已存在于表中,無需插入!"<<endl;
g=1;
}
}while(g==0);
}
if(h==0)
return;
else
{
NAME_NO++;
NameList[NAME_NO-1].py=xin;
int sum=0;
int adr=(NameList[NAME_NO-1].k)%M; //哈希函數
int d=adr;
if(HashList[adr].si==0) //如果不沖突
{
HashList[adr].k=NameList[NAME_NO-1].k;
HashList[adr].py=NameList[NAME_NO-1].py;
HashList[adr].si=1;
}
else //沖突
{
do
{
d=(d+NameList[NAME_NO-1].k%10+1)%M; //偽隨機探測再散列法處理沖突
sum=sum+1; //查找次數加1
}while (HashList[d].k!=0);
HashList[d].k=NameList[NAME_NO-1].k;
HashList[d].py=NameList[NAME_NO-1].py;
HashList[d].si=sum+1;
}
}
}
void main()
{
char ch1;
printf("\n 哈希表\n");
printf(" *-------------------------------------------*\n");
printf(" | D. 顯示哈希表 |\n");
printf(" | F. 查找 |\n");
printf(" | S. 刪除 |\n");
printf(" | E. 插入 |\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=='S'||ch1=='s')
DeleteList();
else if (ch1=='E'||ch1=='e')
EnterList();
else if (ch1=='Q'||ch1=='q')
return;
else
{
printf("\n請輸入正確的選擇!");
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -