#include<stdio.h>
#include<iostream>
#include<string.h>
/*构造匹配表*/
struct Lnode
{
char a[20];
};
struct Lnode list[9];
void save_check()//读取文件信息,写的挺啰嗦,求简单的写法
{
FILE *fp;
if((fp=fopen("file.txt","r"))==NULL)
{
printf("can not open the file\n");
exit(0);
}
char str[20],ch;
int j;
for(int i=0;i<9;i++)
{
fscanf(fp,"%d",&j);
ch=fgetc(fp);
while(ch==' ')
ch=fgetc(fp);
j=0;
while(ch!='\n')
{
str[j++]=ch;
ch=fgetc(fp);
if(feof(fp))
break;
}
str[j]='\0';
strcpy(list[i].a,str);
}
for(j=0;j<9;j++)
puts(list[j].a);
printf("文件检查完毕\n");
system("pause");
}
int hash(char s[])//构造hash函数,取第一二个字母的字母表位置与串长度的和,不知道应该怎么构造,瞎写的
{
char *p,*p1,*p3;
p=p1=s;p3=p1++;
while(*p)
p++;
return (p-p1+*p1-97+*p3-97)%11;
//return (p-p1+*p1-97+*p3-97)%17;
}
void detect(int &i)//探测函数,解决冲突,不是标准的随机探测,但是解决冲突了,大家怎么解决呢?
{
i=(5*i+9)%11;
}
int compare(char a[],char b[])字符串比较,看查到的字符串是不是想要的。不是就执行探测函数,继续查找
{
char *p,*q;
p=a,q=b;
while(*p==*q)
{
if(*p=='\0'||*q=='\0')
break;
q++,p++;
if(*p&&*q)
return 1;
}
return 0;
}
void search(int a[],char s[])//查找操作主控函数
{
int i;
i=hash(s);
while(1)
{
detect(i);
if(compare(s,list[a[i]-1].a)==1)
break;
}
printf("该城市编号为%d\n",a[i]);
}
void main()
{
save_check();
//构造散列表,以串长度与开头两字母在字母表的位置的和为值
int a[11]={0},i,j;
//int a[17];
for(i=0;i<9;i++)
{
j=hash(list[i].a);
if(a[j]==0)
a[j]=i+1;
else
{
while(a[j])
detect(j);
a[j]=i+1;
}
}
//查找
char str[20];
while(1)
{
printf("请输入要查找的城市名\n");
gets(str);
search(a,str);
}
}
file.txt:
1
nanjing
2
beijing
3
tianjin
4
hainan
5
shenzhen
6
xidi
7
hongcun
8
hefei
9
tangshan
不知道这段的理解是不是正确。。。