数据结构已经快学完了,这是自己的第9个实验
包含头文件的文件,在t11.h中
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h" //atoi(),exit();
#include"io.h" //eof()
#include"math.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Boolean;
定义数据结构,包含在文件hash.h中
struct hashtable // 定义存储哈希表的数据结构
{
int *elem;
int length;
// int size;
};
int m; // 定义全局变量,方便求余
在之后就是定义实现功能函数模块,包含在文件hash.cpp中
void inithash(hashtable &H) // 初始化哈希表中的数据
{
printf("哈希表中元素的个数:");
scanf("%d",&H.length);
H.elem=(int *)malloc(H.length*sizeof(int));
if(!H.elem)
{
printf("内存分配失败!");
exit(0);
}
int i=0;
while(i<H.length)
*(H.elem+i++)=0;
}
unsigned hash(int k) // 对元素进行求余操作
{
return k%m;
}
int dingzhi(int i) // 二次探测再散列解决冲突
{
if(0 == i%2) // 偶数时为负数
return -(((i+1)/2)*((i+1)/2));
else
return (((i+1)/2)*((i+1)/2));
}
void collision(int k,int &p,int i) // 寻找下一个探测地址
{
p=(hash(k)+dingzhi(i))%m;
}
void Createhash(hashtable H,int k,int &p,int &c) // 建立哈希表,将元素加入对应的哈希位置
{
p=hash(k); // 取得对应数字哈希位置
int j=0;
while(*(H.elem+p) != 0 && *(H.elem+p) != k) // 该位置是否被元素填充且不相等
{
c++; // 探测次数
if(c <= m) // 小于表长
collision(k,p,c); // 寻找下一个探测地址
else
{
j=1;
break;
}
}
if(j == 0)
*(H.elem+p)=k; // 将数据放入对应的哈希位置
}
void shuru(hashtable H) // 输入数据建立哈希表
{
printf("输入这%d个数:\n",H.length);
int i=0;
int K,p,c=0;
while(i < H.length)
{
scanf("%d",&K);
c=0; // 每次的探测次数需要置0
Createhash(H,K,p,c);
i++;
}
}
void print(hashtable H) // 打印出哈希表对应元素及位置关系
{
printf("数据为:\n");
for(int i=0;i<H.length;i++)
printf("%-3d %d\n",i+1,*(H.elem+i));
}
void searchhash(hashtable H,int k,int &c) // 查找元素
{
int p=hash(k);
while(*(H.elem+p) != k)
{
c++;
if(c < m)
collision(k,p,c);
else
break;
}
if(*(H.elem+p) == k)
printf("找到此元素,在表中第%d个位置\n",p+1);
else
printf("表中无此元素!\n");
}
之后就是主函数调用模块了,包含在头文件main_hash.cpp中
#include"t11.h"
#include"hash.h"
#include"hash.cpp"
void main()
{
hashtable h; // 定义哈希元素单元
int K,c;
char ch='y';
inithash(h); // 初始化哈希表
m=h.length; // 全局变量初始化
shuru(h); // 输入数据
print(h); // 打印出数据单元
while('y' == ch || 'Y' == ch) // 查找元素
{
printf("输入查找的数字:");
scanf("%d",&K);
searchhash(h,K,c=0);
printf("是否继续(y/n):");
getchar();
ch=getchar();
}
}
这个程序师要理解哈希的真正含义,只有自己充分理解算法,才能编出好的程序,在这里只有鼓励自己,踏实的走,一定会优秀的!留住最真的于2012.05.23 21:28写~~~~~~~~~~~~~~