资源简介

题目要求如下:1、设每个记录有下列数据项:电话号码、用户名、地址; 2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表; 3、采用再哈希法解决冲突; 4、查找并显示给定电话号码的记录; 5、查找并显示给定用户名的记录。 6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少两种),考察平均查找长度的变化

资源截图

代码片段和文件信息

#include
#include 
#include
#include
#include 
#include 

using namespace std;

#define MAXSIZE  20  //电话薄记录数量 
#define MAX_SIZE 20    //人名的最大长度
#define HASHSIZE 53    //定义表长  
#define SUCCESS 1
#define UNSUCCESS -1
#define LEN sizeof(HashTable)
typedef int Status;
typedef char NA[MAX_SIZE];

typedef struct{//记录
NA name;
NA tel;
NA add;
}Record;

typedef struct{//哈希表
Record *elem[HASHSIZE];    //数据元素存储基址
int count;                 //当前数据元素个数
int size;                  //当前容量
}HashTable;

Status eq(NA xNA y){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS
if(strcmp(xy)==0)
return SUCCESS;
else return UNSUCCESS;
}

Status NUM_BER;     //记录的个数
HashTable *H;

void getin(Record* a){//键盘输入各人的信息
printf(“输入要添加的个数:\n“);
scanf(“%d“&NUM_BER);
int i; 
for(i=0;i
printf(“请输入第%d个记录的用户名:\n“i+1);
scanf(“%s“a[i].name);
printf(“请输入%d个记录的电话号码:\n“i+1);
scanf(“%s“a[i].tel);
printf(“请输入第%d个记录的地址:\n“i+1);
scanf(“%s“a[i].add);         //gets(str2);??????
}
}

void ShowInformation(Record* a)//显示输入的用户信息

int i;
for( i=0;i printf(“\n第%d个用户信息:\n 姓    名:%s\n 电话号码:%s\n 联系地址:%s\n“i+1a[i].namea[i].tela[i].add); 
}                                   

void Cls(Record* a){
printf(“*“); 
    system(“cls“);
}
long fold(NA s){//人名的折叠处理
char *p;
long sum=0;
NA ss;
strcpy(sss);//复制字符串,不改变原字符串的大小写
strupr(ss);//将字符串ss转换为大写形式
p=ss;
while(*p!=‘\0‘)
sum+=*p++;
printf(“\nsum====================%d“sum); 
return sum;
}

int Hash1(NA str){//哈希函数
long n;
int m;
n=fold(str);//先将用户名进行折叠处理
m=n%HASHSIZE;     //折叠处理后的数,用除留余数法构造哈希函数
return m;   //并返回模值
}


int Hash2(NA str){//哈希函数
long n;
int m;
n = atoi(str);//把字符串转换成整型数.
m=n%HASHSIZE;     //用除留余数法构造哈希函数
return m;   //并返回模值
}

Status collision(int pint &c){//冲突处理函数,采用二次探测再散列法解决冲突
int iq;
i=c/2+1;
while(i if(c%2==0){
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;
}
}
return UNSUCCESS;
}
void benGetTime();
void CreateHash1(HashTable* HRecord* a){//建表,以人的姓名为关键字,建立相应的散列表
//若哈希地址冲突,进行冲突处理
benGetTime();
int ip=-1cpp;                 
for(i=0;i c=0;
p=Hash1(a[i].name);
pp=p;
while(H->elem[pp]!=NULL) {
pp=collision(pc);
if(pp<0){
printf(“第%d记录无法解决冲突“i+1);//需要显示冲突次数时输出
continue;
}//无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]);  //求得哈希地址,将信息存入
H->count++;
printf(“第%d个记录冲突次数为%d。\n“i+1c);//需要显示冲突次数时输出
}
printf(“\n建表完成!\n此哈希表容量为%d当前表内存储的记录个数为%d.\n“HASHSIZEH->count);
benGetTime();
}

void SearchHash1(HashTable* Hint &c){//在通讯录里查找姓名关键字,若查找成功,显示信息
//c用来记录冲突次数查找成功时显示冲突次数
benGetTime();
NA str;
printf(“\n请输入要查找记录的姓名:\n“);
scanf(“%s“str);
int ppp;
p=Hash1

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8148  2010-06-06 13:16  电话号码.cpp

----------- ---------  ---------- -----  ----

                 8148                    1


评论

共有 条评论