哈希表(开放地址法)

yoxibaga 2010-09-07 09:43:00
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define M 9
#define Maxsize 100
#define NULLKEY -1//定义空关键字
#define DELKEY -2//定义删除标记
typedef int Keytype;
typedef struct
{
char name[10];
char tel[12];
int num;
}Infotype;
typedef struct
{
Keytype key;
Infotype data;
int count;
}HashTable[Maxsize];
int PrimeNum(int n)
{
int i,j,k;
for(i=n;i>=3;i--)
{
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k)
{
return i;
break;
}
}
return 0;
}
void InsertHashTable(HashTable ha,Infotype a,int p,int &n)
{
int i,adr;
adr=a.num%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
{
ha[adr].key=a.num;
ha[adr].count=1;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
else
{
i=1;
do
{
adr=(adr+1)%p;
i++;
}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);
ha[adr].key=a.num;
ha[adr].count=i;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
n++;//记录个数增1
}
void CreateHashTable(HashTable ha,Infotype a[],int p,int n,int m)
{
int i,n1=0;
for(i=0;i<n;i++)
{
ha[i].key=NULLKEY;
ha[i].count=0;
memset(&ha[i].data,0,sizeof(Infotype));
}
for(i=0;i<m;i++)
InsertHashTable(ha,a[i],p,n1);
}
void PrintHashTable(HashTable ha,int n)
{
int i;
printf(" 哈希表地址:\t");
for (i=0;i<n;i++)
printf(" %3d",i);
printf(" \n");
printf(" 哈希表关键字:\t");
for (i=0;i<n;i++)
if (ha[i].key==NULLKEY || ha[i].key==DELKEY)
printf(" "); //输出3个空格
else
printf(" %3d",ha[i].key);
printf(" \n");
}
int main()
{
int p,n;
Infotype a[M]={
{5,"liei","15985608522"},
{17,"zhang","13196003789"},
{25,"lhen","13096008522"},
{14,"wng","15894608533"},
{13,"zngwei","15895221471"},
{47,"wunzhu","15896332147"},
{23,"qjianq","14785632589"},
{29,"wulgkd","13085478965"},
{52,"ladkd","14528963214"}};
HashTable ha;
printf("请输入哈希表长度:");
scanf("%d",&n);
while(n>Maxsize)
{
printf("请输入哈希表长度:");
scanf("%d",&n);
}
p=PrimeNum(n);//求小于n的最大素数,作为除留余数法的除数;
printf("%d\n",p);
CreateHashTable(ha,a,p,n,M);//建立哈希表
PrintHashTable(ha,n);//输入哈希表
getch();
return 0;
}
此程序能正常跑,但却不能输出。。麻烦大侠们看看。。小弟在此多谢了。
...全文
238 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoxibaga 2010-09-08
  • 打赏
  • 举报
回复

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define M 9
#define Maxsize 100
#define NULLKEY -1//定义空关键字
#define DELKEY -2//定义删除标记
typedef int Keytype;
typedef struct
{
char name[10];
char tel[12];
int num;
}Infotype;
typedef struct
{
Keytype key;//关键字
Infotype data;//其他数据,类型为Infotype
int count;//探索次数
}HashTable[Maxsize];
int PrimeNum(int n)
{
int i,j,k;
for(i=n;i>=3;i--)
{
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k)
{
return i;
break;
}
}
return 0;
}
void InsertHashTable(HashTable ha,Infotype a,int p,int &n)
{
int i,adr;
adr=a.num%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
{
ha[adr].key=a.num;
ha[adr].count=1;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
else
{
i=1;
do
{
adr=(adr+1)%p;
i++;
}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);
ha[adr].key=a.num;
ha[adr].count=i;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
n++;//记录个数增1
}
void CreateHashTable(HashTable ha,Infotype a[],int p,int n,int m)
{
int i,n1=0;
for(i=0;i<n;i++)
{
ha[i].key=NULLKEY;
ha[i].count=0;
memset(&ha[i].data,0,sizeof(Infotype));
}
for(i=0;i<m;i++)
InsertHashTable(ha,a[i],p,n1);
}
void PrintHashTable(HashTable ha,int n)
{
int i;
printf(" 哈希表地址:\t");
for (i=0;i<n;i++)
printf(" %3d",i);
printf(" \n");
printf(" 哈希表关键字:\t");
for(i=0;i<n;i++)
if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
printf(" "); //输出3个空格
else
printf(" %3d",ha[i].key);
printf(" \n");
}
int main()
{
int p,n;
HashTable ha;
Infotype a[M]={{5,"liei","15985608522"},{17,"zhang","13196003789"},{25,"lhen","13096008522"},{14,"wng","15894608533"},
{13,"zngwei","15895221471"},{47,"wunzhu","15896332147"},{23,"qjianq","14785632589"},{29,"wulgkd","13085478965"},{52,"ladkd","14528963214"}};//为了减少每次运行输入的麻烦
printf("请输入哈希表长度:");
scanf("%d",&n);
while(n>Maxsize)
{
printf("请输入哈希表长度:");
scanf("%d",&n);
}
p=PrimeNum(n);//求小于n的最大素数,作为除留余数法的除数;
printf("%d\n",p);
CreateHashTable(ha,a,p,n,M);//建立哈希表,n为哈希表长度,M为关键字数组的长度
PrintHashTable(ha,n);//输入哈希表
getch();
return 0;
}
yoxibaga 2010-09-08
  • 打赏
  • 举报
回复
2L,我重新贴了代码,C++不是很看得懂。麻烦看看吧。。谢谢啦。[align=center]

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define M 9
#define Maxsize 100
#define NULLKEY -1//定义空关键字
#define DELKEY -2//定义删除标记
typedef int Keytype;
typedef struct
{
char name[10];
char tel[12];
int num;
}Infotype;
typedef struct
{
Keytype key;//关键字
Infotype data;//其他数据,类型为Infotype
int count;//探索次数
}HashTable[Maxsize];
int PrimeNum(int n)
{
int i,j,k;
for(i=n;i>=3;i--)
{
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k)
{
return i;
break;
}
}
return 0;
}
void InsertHashTable(HashTable ha,Infotype a,int p,int &n)
{
int i,adr;
adr=a.num%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
{
ha[adr].key=a.num;
ha[adr].count=1;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
else
{
i=1;
do
{
adr=(adr+1)%p;
i++;
}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);
ha[adr].key=a.num;
ha[adr].count=i;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
n++;//记录个数增1
}
void CreateHashTable(HashTable ha,Infotype a[],int p,int n,int m)
{
int i,n1=0;
for(i=0;i<n;i++)
{
ha[i].key=NULLKEY;
ha[i].count=0;
memset(&ha[i].data,0,sizeof(Infotype));
}
for(i=0;i<m;i++)
InsertHashTable(ha,a[i],p,n1);
}
void PrintHashTable(HashTable ha,int n)
{
int i;
printf(" 哈希表地址:\t");
for (i=0;i<n;i++)
printf(" %3d",i);
printf(" \n");
printf(" 哈希表关键字:\t");
for(i=0;i<n;i++)
if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
printf(" "); //输出3个空格
else
printf(" %3d",ha[i].key);
printf(" \n");
}
int main()
{
int p,n;
HashTable ha;
Infotype a[M]={{5,"liei","15985608522"},{17,"zhang","13196003789"}, {25,"lhen","13096008522"},{14,"wng","15894608533"},{13,"zngwei","15895221471"},{47,"wunzhu","15896332147"},{23,"qjianq","14785632589"},{29,"wulgkd","13085478965"},{52,"ladkd","14528963214"}};//为了减少每次运行输入的麻烦
printf("请输入哈希表长度:");
scanf("%d",&n);
while(n>Maxsize)
{
printf("请输入哈希表长度:");
scanf("%d",&n);
}
p=PrimeNum(n);//求小于n的最大素数,作为除留余数法的除数;
printf("%d\n",p);
CreateHashTable(ha,a,p,n,M);//建立哈希表,n为哈希表长度,M为关键字数组的长度
PrintHashTable(ha,n);//输入哈希表
getch();
return 0;
}[/align]
yoxibaga 2010-09-08
  • 打赏
  • 举报
回复
code=C/C++
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "math.h"
#define M 9
#define Maxsize 100
#define NULLKEY -1//定义空关键字
#define DELKEY -2//定义删除标记
typedef int Keytype;
typedef struct
{
char name[10];
char tel[12];
int num;
}Infotype;
typedef struct
{
Keytype key;//关键字
Infotype data;//其他数据,类型为Infotype
int count;//探索次数
}HashTable[Maxsize];
int PrimeNum(int n)
{
int i,j,k;
for(i=n;i>=3;i--)
{
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0) break;
if(j>k)
{
return i;
break;
}
}
return 0;
}
void InsertHashTable(HashTable ha,Infotype a,int p,int &n)
{
int i,adr;
adr=a.num%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)
{
ha[adr].key=a.num;
ha[adr].count=1;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
else
{
i=1;
do
{
adr=(adr+1)%p;
i++;
}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);
ha[adr].key=a.num;
ha[adr].count=i;
strcpy(ha[adr].data.name,a.name);
strcpy(ha[adr].data.tel,a.tel);
}
n++;//记录个数增1
}
void CreateHashTable(HashTable ha,Infotype a[],int p,int n,int m)
{
int i,n1=0;
for(i=0;i<n;i++)
{
ha[i].key=NULLKEY;
ha[i].count=0;
memset(&ha[i].data,0,sizeof(Infotype));
}
for(i=0;i<m;i++)
InsertHashTable(ha,a[i],p,n1);
}
void PrintHashTable(HashTable ha,int n)
{
int i;
printf(" 哈希表地址:\t");
for(i=0;i<n;i++)
printf(" %3d",i);
printf(" \n");
printf(" 哈希表关键字:\t");
for(i=0;i<n;i++)
if(ha[i].key==NULLKEY || ha[i].key==DELKEY)
printf(" "); //输出3个空格
else
printf(" %3d",ha[i].key);
printf(" \n");
}
int main()
{
int p,n;
HashTable ha;
Infotype a[M]={{5,"liei","15985608522"},{17,"zhang","13196003789"},{25,"lhen","13096008522"},{14,"wng","15894608533"},
{13,"zngwei","15895221471"},{47,"wunzhu","15896332147"},{23,"qjianq","14785632589"},{29,"wulgkd","13085478965"},{52,"ladkd","14528963214"}};//为了减少每次运行输入的麻烦
printf("请输入哈希表长度:");
scanf("%d",&n);
while(n>Maxsize)
{
printf("请输入哈希表长度:");
scanf("%d",&n);
}
p=PrimeNum(n);//求小于n的最大素数,作为除留余数法的除数;
printf("%d\n",p);
CreateHashTable(ha,a,p,n,M);//建立哈希表,n为哈希表长度,M为关键字数组的长度
PrintHashTable(ha,n);//输入哈希表
getch();
return 0;
}
djjlove_2008 2010-09-07
  • 打赏
  • 举报
回复
你的代码看起来很吃力哈,你写好些,我再帮你看看,编程风格好些。
djjlove_2008 2010-09-07
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

template<class E,class K>

class HashTable

{

public:

HashTable(int divisor=10);

HashTable():D(0),ht(0),empty(0)

{}

~HashTable()

{

delete [] ht;

delete [] empty;

}

bool Search(const K & k,E & e);

bool insert(const E & e);

bool delhash(const K & k);

bool output();

int getsize()

{

return D;

}

private:

int hsearch(const K & k) const;

int D;

E * ht;

bool * empty;

};

template<class E,class K>

int HashTable<E,K>::hsearch(const K & k) const

{

//查找一个地址表中,如果存在,则返回它的位置

//否则,则插入;

int i=k%D;

int j=i;

do

{

if(empty[i]||ht[j]==k)

return j;

j=(j+1)%D;

}

while(j!=1);

return j;

}

//构造函数;

template<class E,class K>

HashTable<E,K>::HashTable(int divisor)

{

D=divisor;

ht=new E[D];

empty=new bool[D];

for(int i=0;i<D;i++)

empty[i]=true;

}

这是主要代码。

69,373

社区成员

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

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