?? hash221.c
字號:
#define M 30//源表長
#define N 50//哈希表長
#define p 47//除數(shù),為質(zhì)數(shù),且不能超過五十,初次散列的表達(dá)式:d=L[i].shuzhi%p;
//再次散列的表達(dá)式:d=(d-10+(7*d))%p;()
#define K 1000
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<malloc.h>
#include<dos.h>
/*typedef struct {
char * a;
int length;
int size;
}list;*/
typedef struct{
char *name;
char *pinyin;
int shuzhi;
}yuanbiao;
typedef struct{
//char *pinyin;
char *name;//這里的名字和源表中一樣
char *pinyin;
int shuzhi;
int dizhi;//哈希元素的存放地址
int biaoji;//
int sum;//標(biāo)記計(jì)算的次數(shù)
}hshlst;
typedef struct{
hshlst *H;
int length;
int size;
}hashlist;
hashlist init_hashlist(){
hashlist T;
//char a[20];
//char b[20];
T.H=(hshlst *)malloc(N*sizeof(hshlst));
//T.H->name=a;
//T.H->pinyin=b;
T.length=0;
T.size=N;
return T;
}
//hshlst H[N];//還要記得把H的大小做成可變的!
Init_list(yuanbiao L[]){
printf("init\n");
L[0].name="陳紅霞";L[0].pinyin="chenhongxia";
L[1].name="王偉";L[1].pinyin="wangwei";
L[2].name="胡軍輕";L[2].pinyin="hujunqing";
L[3].name="張海霞";L[3].pinyin="zhanghaixia";
L[4].name="咸正海";L[4].pinyin="xianhaizheng";
L[5].name="于蔡琰";L[5].pinyin="yucaiyan";
L[6].name="郭興燕";L[6].pinyin="guoxingyan";
L[7].name="劉麗麗";L[7].pinyin="liulili";
L[8].name="唐駿龍";L[8].pinyin="tangjunlong";
L[9].name="高睿哲";L[9].pinyin="gaoruizhe";
L[10].name="唐建雷";L[10].pinyin="tangjianlei";
L[11].name="王雪域";L[11].pinyin="wangxueyu";
L[12].name="李蒙山";L[12].pinyin="limengshan";
L[13].name="任之文";L[13].pinyin="renzhiwen";
L[15].name="高天驕";L[15].pinyin="gaotianjiao";
L[14].name="劉通明";L[14].pinyin="liutongming";
L[16].name="張秀美";L[16].pinyin="zhanxiumei";
L[17].name="吳瑩瑩";L[17].pinyin="wuyinyyiny";
L[18].name="劉曉強(qiáng)";L[18].pinyin="liuxiangqiang";
L[19].name="喬守星";L[19].pinyin="qiaoshouxing";
L[20].name="于后康";L[20].pinyin="yuhoukang";
L[21].name="朱麗娟";L[21].pinyin="zhulijuan";
L[22].name="付吉亮";L[22].pinyin="fujiliang";
L[23].name="李謙誠";L[23].pinyin="liqiancheng";
L[24].name="吳俊杰";L[24].pinyin="wujunjie";
L[25].name="鄭程博";L[25].pinyin="zhengchengbo";
L[26].name="騰立濤";L[26].pinyin="tenglitao";
L[27].name="孔偉政";L[27].pinyin="kongweizheng";
L[28].name="莊佳";L[28].pinyin="zhuangjia";
L[29].name="王迪";L[29].pinyin="wangdi";
//L[30].name="趙棟棟";L[30].pinyin="zhangdong";//多了一個(gè),轉(zhuǎn)化時(shí)會(huì)使程序非正常終止
//return L[M];//
printf("init over\n");
}
//****************拼音轉(zhuǎn)化為數(shù)字********************//
int transform(char *a){
int t,i;
char *b;
b=a;
t=*b;
for(i=0;*a!='\0'&& i<strlen(a);a+=4,i+=4)//因?yàn)閍的數(shù)組大小是20,如果不判斷是否結(jié)束的話會(huì)出現(xiàn)負(fù)值
//while(*a!='\0')
//a++;
t+=(*a);
//printf("%d \n",t);
return t;
}
/*****************構(gòu)建哈希表******************/
create_hash(yuanbiao L[],hshlst H[]){
int i,j;
int d,t;
printf("begin create\n");
for(j=0;j<N;j++){//置空哈希表
H[j].name="";
H[j].shuzhi=0;
H[j].pinyin="";
H[j].dizhi=0;
H[j].biaoji=0;
H[j].sum=0;
}
printf("create nil hashist over\n");//////
/*printf("print\n");
printf("%d\n",T.H[0].biaoji);*/
/*for(i=0;i<M;i++)
printf("%s ",L[i].name);
printf("\n");*/
for(i=0;i<M;i++){
d=L[i].shuzhi%p;//
if(!H[d].biaoji){
H[d].name=L[i].name;
//printf("%s ",H[d].name);
H[d].pinyin =L[i].pinyin;
H[d].shuzhi=L[i].shuzhi;
H[d].dizhi=d;
H[d].biaoji =1;
H[d].sum++;
}//if
else{
t=1;
while(H[d].biaoji){
d=(d-10+(7*d))%p;//這個(gè)地方剛開始寫錯(cuò)了,寫成了-500,結(jié)果到后面都不打印了?。?!
t++;
}
H[d].name=L[i].name;
//printf("%s ",H[d].name);
H[d].pinyin =L[i].pinyin;
H[d].shuzhi=L[i].shuzhi;
H[d].dizhi=d;
H[d].biaoji =1;
H[d].sum=t;
}//else*/
}//for
printf("end create\n");
}//create
/*insert(hshlst H[],char *a,int d){
char temp[20];
char *b;
b=temp;
printf("please input his(or her) chinese name:");
scanf("%s",b);
printf("\n");
H[d].biaoji =1;
H[d].dizhi =d;
H[d].name =b;
}//insert*/
insert(hashlist T,int flag){
int d,t,s=1,i;
char b[20],a[20];
char *py;
hashlist X;
py=b;
//for(i=0;i<N;i++)
//printf("%s",T.H[i].name);
X=T;
if(flag)goto begin;
printf("input the person's pinyin name\n");
scanf("%s",py);
t=transform(py);
d=t%p;
while(T.H[d].biaoji){
if(!strcmp(T.H[d].pinyin,py)){
printf("the data has exist!\n");
goto end;
}
else {
d=(d-10+(7*d))%p;
s++;
}
}
begin:T.H=realloc(T.H,N*sizeof(hshlst));
T.H =X.H;
T.length=N;
T.size=N;
//strcpy(T.H[d].pinyin,py);
//T.H[d].pinyin =a;
for(i=0;*py!='\0'i<strlen(py);i++,py++,T.H[d].pinyin++)
*T.H[d].pinyin =*py;
*T.H[d].pinyin='\0';
//printf("H[d].pinyin=%s\n",H[d].pinyin);
T.H[d].shuzhi=t;
T.H[d].dizhi=d;
T.H[d].biaoji =1;
T.H[d].sum=s;
printf("please input the person's chinese name:\n");
scanf("%s",a);
T.H[d].name=a;
//printf("%s\n",H[d].name);
end:return d;
}
search(hshlst H[]){
int t,d;
char *a,str[20];
char m;
a=str;
printf("please input the name you want to search:\n");
scanf("%s",a);
t=transform(a);
//printf("t=%d\n",t);getch();//t變成了負(fù)數(shù)???
d=t%p;
while(H[d].biaoji){
if(!(strcmp(a,H[d].pinyin))){
printf("the person you want to search has found,his(or her) chinese name is:%s\n",H[d].name);
return ;
}
else
d=(d-10+(7*d))%p;
}
printf("no match!\n");
/*loop:printf("do you want to insert into the list you the datas that can't foud? Y|N\n");
scanf("%c",&m);
switch (m){
case 'Y':insert(H,a,d);
case 'N':return;
default:printf("input error!\n");goto loop;
}*/
}//search*/
showhash(hshlst H[]){
int i,j=0,t;
for(i=0;i<N;i++)
if(H[i].pinyin!=""){
t=j%5;
printf("%s ",H[i].pinyin);
if(!t) printf("\n");
j++;
}
printf("\n");
//j=0;
/*for(i=0;i<N;i++)
if(H[i].dizhi){
t=j%5;
printf("%d ",H[i].dizhi);
if(!t) printf("\n");
j++;
}*/
return j;
}
void main(){
int i,d;
char t[20];
yuanbiao L[M];
hashlist T;
char a[20];
T=init_hashlist();
Init_list(L);
printf("trans\n");
for(i=0;i<M;i++)//因?yàn)閠ransform函數(shù)要被兩次調(diào)用到,故用此寫法
L[i].shuzhi=transform(L[i].pinyin);
printf("trans over\n");
//以下是調(diào)試用句1,顯示轉(zhuǎn)化后的數(shù)字
//***********************
/*printf("begin\n");
for(i=0;i<M;i++)
printf("%d ",L[i].shuzhi);
printf("end\n");*/
//*****************調(diào)試用句1,顯示拼音的轉(zhuǎn)化值
//**********創(chuàng)建哈希表
create_hash(L,T.H);T.length =N;
printf("\n");
//system("cls");//清屏
//**********創(chuàng)建哈希表
//以下調(diào)試語句二,顯示哈希表中的姓名
//***************//
/*printf("show\n");
for(i=0;i<N;i++)
if(T.H[i].name!="")
printf("%s ",T.H[i].name);
printf("\n");*/
//***************調(diào)試語句二,顯示哈希表中的姓名**//
loop:printf("------哈希表查找--------\n");
printf("please choose one number\n");
printf("1.show the hashlist\n");
printf("2.search one name from the hashlist\n");
printf("3.insert into one data\n");
printf("4.exit \n");
scanf("%s",t);
i=atoi(t);
if(i==4){printf("thank you ,bye bye\n");exit(1);}
if(i==2){search(T.H);goto loop;}
if(i==1){showhash(T.H);goto loop;}
if(i==3){
//printf("input the pinyin\n");
//scanf("%s",a);
d=insert(T,0);
printf("%d\n",T.H[d].dizhi);
goto loop;
}
printf("input error!please input again.\n");goto loop;
//printf("search over\n");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -