数据结构问题,高分悬赏!要求如题所述 100
//stdafx.h#include<stdio.h>#include<stdio.h>#include<malloc.h>#include<string.h>#defi...
//stdafx.h
#include <stdio.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAX_SIZE 20 //人名的最大长度
#define Rec_NUM 3 //记录的个数
#define HASHSIZE 40 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
#define LEN sizeof(HashTable)
typedef int Status;
typedef char NA[MAX_SIZE];
typedef struct{ //记录
NA name;
}Record;
typedef struct //哈希表
{
Record *elem[HASHSIZE]; //数据元素存储基址
int count; //当前数据元素个数
int size; //当前容量
}HashTable;
void getin(Record* a) //键盘输入各人的信息
{
int i;
printf("请输入姓名!\n注:1、用户名以小写汉语拼音形式输入,字符间不要输入空格!\n");
printf(" 2、用户名长度不得超过%d个字符!\n\n",MAX_SIZE-1);
for(i=0;i<Rec_NUM;i++) {
printf("请输入第%d个记录的用户名:\n",i+1);
scanf("%s",a[i].name);
}
}
long int fold(NA s) //人名的折叠处理
{
char *p;
long int sum=0;
NA ss;
strcpy(ss,s); //复制字符串,不改变原字符串的大小写
strupr(ss); //防止出现2个相同名字,却出现在不同地方,如liyuan,LIYUAN
p=ss;
while(*p!='\0')
sum+=*p++;
return sum;
}
int Hash(NA str){ //哈希函数
long int fold_num;
int remainder;
fold_num=fold(str); //先将用户名进行折叠处理
remainder=fold_num%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数
return remainder; //并返回模值
}
Status collision(int p,int &c) //冲突处理函数,采用二次探测再散列法解决冲突,【这一段什么意思,不大理解】
{ //【我现在要把这段改成伪随机数序列,要如何改?】
int i,q;
i=c/2+1;
while(i<HASHSIZE)
{
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 CreateHash(HashTable* H,Record* a) //建表,以30人的姓名为关键字,建立相应的散列表
{ //若哈希地址冲突,进行冲突处理
int i,p=-1,c,pp;
for(i=0;i<Rec_NUM;i++)
{
c=0;
p=Hash(a[i].name);
pp=p;
while(H->elem[pp]!=NULL)
{
pp=collision(p,c);
if(pp<0)
{
printf( "第%d记录无法解决冲突", i+1 ); //需要显示冲突次数时输出
continue;
} //无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入
H->count++;
printf("第%d个记录冲突次数为%d。\n",i+1,c); //需要显示冲突次数时输出
}
printf("\n当前哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);
}
void ClearHash(HashTable *H) //清空哈希表
{
for (int i=0;i<HASHSIZE;i++)
{
H->elem[i]=NULL;
H->count=0;
}
}
请高手帮解释一下那一段什么意思,要改的话怎么改,发我邮箱:
461323278@163.com,谢谢,答得好我会追分的
//main.cpp
#include "stdafx.h"
#include < iostream >
using std::cout;
using std::endl;
int main( )
{
char ch;
HashTable *H;
H=(HashTable*)malloc(LEN);
for(int i=0;i<HASHSIZE;i++)
H->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Record a[Rec_NUM];
getin(a); //从键盘输入各记录
CreateHash(H,a); //分别以姓名为关键字建立散列表
ClearHash(H);
while(1)
{
cout<< "rebuild the figure? input Y/N or y/n" << endl;
while(1)
{
ch=getchar();
if(ch=='Y'||ch=='y')
break;
else if(ch=='N'||ch=='n')
{
cout << "build ended!\nprogram exit!" << endl;
return 0;
}
else
continue;
}
system("pause");
system("cls");
getin(a);
CreateHash(H,a);
ClearHash(H);
}
return 0;
} 展开
#include <stdio.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAX_SIZE 20 //人名的最大长度
#define Rec_NUM 3 //记录的个数
#define HASHSIZE 40 //定义表长
#define SUCCESS 1
#define UNSUCCESS -1
#define LEN sizeof(HashTable)
typedef int Status;
typedef char NA[MAX_SIZE];
typedef struct{ //记录
NA name;
}Record;
typedef struct //哈希表
{
Record *elem[HASHSIZE]; //数据元素存储基址
int count; //当前数据元素个数
int size; //当前容量
}HashTable;
void getin(Record* a) //键盘输入各人的信息
{
int i;
printf("请输入姓名!\n注:1、用户名以小写汉语拼音形式输入,字符间不要输入空格!\n");
printf(" 2、用户名长度不得超过%d个字符!\n\n",MAX_SIZE-1);
for(i=0;i<Rec_NUM;i++) {
printf("请输入第%d个记录的用户名:\n",i+1);
scanf("%s",a[i].name);
}
}
long int fold(NA s) //人名的折叠处理
{
char *p;
long int sum=0;
NA ss;
strcpy(ss,s); //复制字符串,不改变原字符串的大小写
strupr(ss); //防止出现2个相同名字,却出现在不同地方,如liyuan,LIYUAN
p=ss;
while(*p!='\0')
sum+=*p++;
return sum;
}
int Hash(NA str){ //哈希函数
long int fold_num;
int remainder;
fold_num=fold(str); //先将用户名进行折叠处理
remainder=fold_num%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数
return remainder; //并返回模值
}
Status collision(int p,int &c) //冲突处理函数,采用二次探测再散列法解决冲突,【这一段什么意思,不大理解】
{ //【我现在要把这段改成伪随机数序列,要如何改?】
int i,q;
i=c/2+1;
while(i<HASHSIZE)
{
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 CreateHash(HashTable* H,Record* a) //建表,以30人的姓名为关键字,建立相应的散列表
{ //若哈希地址冲突,进行冲突处理
int i,p=-1,c,pp;
for(i=0;i<Rec_NUM;i++)
{
c=0;
p=Hash(a[i].name);
pp=p;
while(H->elem[pp]!=NULL)
{
pp=collision(p,c);
if(pp<0)
{
printf( "第%d记录无法解决冲突", i+1 ); //需要显示冲突次数时输出
continue;
} //无法解决冲突,跳入下一循环
}
H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入
H->count++;
printf("第%d个记录冲突次数为%d。\n",i+1,c); //需要显示冲突次数时输出
}
printf("\n当前哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);
}
void ClearHash(HashTable *H) //清空哈希表
{
for (int i=0;i<HASHSIZE;i++)
{
H->elem[i]=NULL;
H->count=0;
}
}
请高手帮解释一下那一段什么意思,要改的话怎么改,发我邮箱:
461323278@163.com,谢谢,答得好我会追分的
//main.cpp
#include "stdafx.h"
#include < iostream >
using std::cout;
using std::endl;
int main( )
{
char ch;
HashTable *H;
H=(HashTable*)malloc(LEN);
for(int i=0;i<HASHSIZE;i++)
H->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Record a[Rec_NUM];
getin(a); //从键盘输入各记录
CreateHash(H,a); //分别以姓名为关键字建立散列表
ClearHash(H);
while(1)
{
cout<< "rebuild the figure? input Y/N or y/n" << endl;
while(1)
{
ch=getchar();
if(ch=='Y'||ch=='y')
break;
else if(ch=='N'||ch=='n')
{
cout << "build ended!\nprogram exit!" << endl;
return 0;
}
else
continue;
}
system("pause");
system("cls");
getin(a);
CreateHash(H,a);
ClearHash(H);
}
return 0;
} 展开
3个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询