正在做数据结构的课程设计,有关通讯录的系统设计,要用C,要用哈希表,求高手!!!!!!!!!!!!

如题所述

第1个回答  2011-07-05
#include<stdio.h>
#include<iostream>
#include<conio.h>

using namespace std;

#define HASH_LEN 50
#define M 47
int NAME_NO=30;

typedef struct
{
char *py;
int k;
}NAME;

NAME NameList[HASH_LEN];

typedef struct
{
char *py;
int k;
int si;
}HASH;

HASH HashList[HASH_LEN];

void InitNameList()
{
char *f;
int r,s0,i;
NameList[0].py="jiangyi";
NameList[1].py="zhouling";
NameList[2].py="yizhiqiang";
NameList[3].py="xielu";
NameList[4].py="lichi";
NameList[5].py="yixiaoxia";
NameList[6].py="tanxi";
NameList[7].py="zhangxiaowen";
NameList[8].py="lilin";
NameList[9].py="ouyangyong";
NameList[10].py="chenkaihan";
NameList[11].py="maqingyu";
NameList[12].py="hefei";
NameList[13].py="luowen";
NameList[14].py="yangwencheng";
NameList[15].py="wangzhen";
NameList[16].py="xiazhiguo";
NameList[17].py="caifuxian";
NameList[18].py="shenwenbo";
NameList[19].py="gaoyuehua";
NameList[20].py="xiaoyubin";
NameList[21].py="wangwei";
NameList[22].py="huangyingbo";
NameList[23].py="gongchong";
NameList[24].py="wuhang";
NameList[25].py="zhouweicheng";
NameList[26].py="yubo";
NameList[27].py="dengliquan";
NameList[28].py="liuyuan";
NameList[29].py="luokaibo";
for (i=0;i<NAME_NO;i++)
{
s0=0;
f=NameList[i].py;
for (r=0;*(f+r)!='\0';r++)
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}

void CreateHashList()
{
int i;
for (i=0; i<NAME_NO;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;
}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]=;
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)
{
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<NAME_NO; i++)
{
if(HashList[i].k%M==0)
HashList[i].py="";
}
printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t 名称\n");
for(i=0; i<NAME_NO; 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");
}
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]=;
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)
{
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;
g=1;
}
}while(g==0);
}
}

void EnterList()
{
char st[20];
char *xin;
xin=st;
int s0=0,r,sum=1,adr,d,h;
printf("\n请输入人名的拼音:");
cin>>xin;
for (r=0;*(xin+r)!='\0';r++)
{
s0=(int)(*(xin+r))+s0;
}
adr=s0%M;
d=adr;
if(HashList[adr].k==s0)
{
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;
}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(" | A. 显示哈希表 |\n");
printf(" | B. 查找 |\n");
printf(" | C. 删除 |\n");
printf(" | D. 插入 |\n");
printf(" | E. 退出 |\n");
printf(" *-------------------------------------------*\n");
InitNameList();
CreateHashList ();
while(1)
{
printf("\n 请输入执行命令:");
fflush(stdin);
ch1=getchar();
if (ch1=='A'||ch1=='a')
Display();
else if (ch1=='B'||ch1=='b')
FindList();
else if (ch1=='C'||ch1=='c')
DeleteList();
else if (ch1=='D'||ch1=='d')
EnterList();
else if (ch1=='E'||ch1=='e')
return;
else
{
printf("\n请输入正确的选择!");
}
}
}
另外,团IDC网上有许多产品团购,便宜有口碑
第2个回答  2011-07-04
char ch1; printf(追问

详细点!!!!