[置顶] 数据结构实验-查找-哈希表

数据结构已经快学完了,这是自己的第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();
 } 
}

[置顶] 数据结构实验-查找-哈希表_第1张图片

这个程序师要理解哈希的真正含义,只有自己充分理解算法,才能编出好的程序,在这里只有鼓励自己,踏实的走,一定会优秀的!留住最真的于2012.05.23  21:28写~~~~~~~~~~~~~~

你可能感兴趣的:([置顶] 数据结构实验-查找-哈希表)