高手赐教:用散列表法编写电话号码查询系统(c语言)

a97077717 2012-12-13 02:15:34
(1) 设每个记录有下列数据项:电话号码、用户名、地址;
(2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;
(3) 采用双散列法解决冲突;
(4) 查找并显示给定电话号码的记录;
(5) 查找并显示给定用户名的记录。

哪位师兄 师姐看见的话 求救命啊。
...全文
345 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wintree 2012-12-14
  • 打赏
  • 举报
回复
首先写个得到散列code的函数,百度很多 对两个字符串散列, 晚上很多例子的。。。。看一下你就懂了 http://blog.sina.com.cn/s/blog_70176ec00100m24v.html
科比布莱恩特 2012-12-14
  • 打赏
  • 举报
回复
引用 楼主 a97077717 的回复:
(1) 设每个记录有下列数据项:电话号码、用户名、地址; (2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表; (3) 采用双散列法解决冲突; (4) 查找并显示给定电话号码的记录; (5) 查找并显示给定用户名的记录。 哪位师兄 师姐看见的话 求救命啊。
不行散列表行吗?
newtee 2012-12-14
  • 打赏
  • 举报
回复
参考:
#include<stdio.h>
#include<string.h>
#define N 50
#define P1 47
#define LEN 20 
char tbl[N][LEN];
int H1(char *key)
{
	long k,d=0;
	int c;
	while(*key)
      d=d+*key++;
    k=d;
	k=((k*k)%10000-(k*k)%100)/100;
	return k%P1;
}
/*int H1(char *key)
{
	int temp[10];
	long k,d=0,e;
	int c,f,g;
	while(*key)
	  d=d+*key++;
    d=d*d;
	e=d;
	for(c=0;e!=0;c++)
	{
        e=e/10;
	}
    g=c;
    for(f=c;f>=0;f--)
	{
		temp[--g]=d%10;
		d/=10;
	}
	k=temp[c/2]*10+temp[c/2+1];
	return k%P1;

}*/
int Search(char *key_word )
{   
    int pos,c=5;
    pos=H1(key_word);
    if (strcmp(tbl[pos],key_word)==0)
        return  pos;
    while(tbl[pos][0]!='\0'&& strcmp(tbl[pos],key_word) ) 
        pos=(pos+c)%N;     
    if(tbl[pos][0]=='\0')
        return  -1;
    else  return  pos;
}
char *k_word[]={"Wangdepeng","caozuan","zhangji","baiyi","wangwang","xiaohun","xiaojun","wangan","lida","nijiang",
                "Wanghao","wangxiaoha","lijian","neicun","chenghao","lixiaoyang","lihui","lidada","wangxiaoxiao","caomimi",
				"Nidada","woshishui","pengpeng","xiaoyiyi","depeng","fadiande","zhuguanjun","baoshanwei","baowei","kouwei"};
void main()
{
	int count[N],i,pos,c,n;
	char k_name[LEN];
	char m;
	for(i=0;i<N;i++)
	{
		count[i]=0;
		tbl[i][0]='\0';
	}
	n=sizeof(k_word)/sizeof(k_word[i]);
    for(i=0;i<n;i++)
	{
		pos=H1(k_word[i]);
        c=5;
		while(tbl[pos][0]!='\0'&&strcmp(tbl[pos],k_word[i]))
		{
			count[pos]++;
			pos=(pos+c)%N;
		}
		strcpy(tbl[pos],k_word[i]);
	}
	for(i=c=0;i<N;i++)
	   if(tbl[i][0]!='\0')
	   	printf("%10s%c",tbl[i],++c%5==0? '\n':'\t');
	    printf("\n\n");
	for(i=c=0;i<N;i++)
		if(tbl[i][0]!='\0')
		printf("%4d%c",count[i],++c%5==0? '\n':'\t');
	    printf("\n\n");
	for(i=c=0;i<N;i++)
    if(tbl[i][0]!='\0')
     c+=count[i]+1;
    printf("ASL=%.2f\n\n",(float)c/n);  
    printf("Please input a keyword:");  
	for(;;)
	{
	gets(k_name);
    pos=Search(k_name);
    if(pos!=-1)  printf(" found at %d\n",pos);
    else   printf("not found ! \n");
	}
    m=getchar();
        
}



69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧