散列法解决1000个整数的搜索

来源:互联网 发布:动态桌面软件 编辑:程序博客网 时间:2024/05/17 22:41

/*
 *散列法解决1000个整数的搜索问题(为了方便显示结果,程序中将1000改为了100)
 */

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define LEN 100
typedef int dataType;

typedef struct HNode
{
 dataType key;    //关键字
 int flag;        //判断是否被赋值
}HNode;

//初始化数据
void initData(dataType data[],int len);
//打印数据
void printData(dataType data[],int len);
//在原数组中查找元素下标,找不到则返回-1
int searchInData(dataType data[],int d);
//初始化哈希表
void initHash(HNode arr[],dataType data[],int len);
//打印哈希表
void printHash(HNode arr[],int len);

//如果冲突,采用开放地址法的线性探测在散列
int getIndex(HNode arr[],int d);

//查找元素,查找成功返回1,否则返回0
int search(HNode arr[],int d);


int main()
{
 int keyword;
 int tempIndex;
 dataType data[LEN];
 HNode arr[LEN];
 initData(data,LEN);
 printData(data,LEN);
 initHash(arr,data,LEN);
 printHash(arr,LEN);

 printf("\n输入要查找的整数(输入q结束):");
 while(scanf("%d",&keyword))
 { 
  tempIndex = searchInData(data,keyword);
  if(tempIndex != -1)
  {
   printf("%d在元素数组中的下标是%d\n",keyword,tempIndex);
  }
  if(search(arr,keyword))
  {
   printf("查找成功!\n");
  }
  else
  {
   printf("查找失败!\n");
  }
  printf("\n输入要查找的整数(输入q结束):");
 }
 
 return 0;
}

//初始化数据
void initData(dataType data[],int len)
{
 int i;
 srand((unsigned)time(NULL));
 for(i = 0; i < len; i++)
 {
  data[i] = rand();
 }
}

//打印数据
void printData(dataType data[],int len)
{
 int i;

 printf("原始数据:");
 for(i = 0; i < len; i++)
 {
  if(i % 10 == 0)
  {
   printf("\n");
  }
  printf("%d\t",data[i]);
 }
 printf("\n");
}

//在原数组中查找元素下标,找不到则返回-1
int searchInData(dataType data[],int d)
{
 int i;

 for(i = 0; i < LEN; i++)
 {
  if(data[i] == d)
  {
   return i;
  }
 }
 return -1;
}

//初始化哈希表
void initHash(HNode arr[],dataType data[],int len)
{
 int i;
 int index;
 for(i = 0; i < len; i++)
 {
  index = getIndex(arr,data[i]);
  arr[index].key = data[i];
  arr[index].flag = 1;
 }
}

//打印哈希表
void printHash(HNode arr[],int len)
{
 int i;

 printf("Hash表中的数据:");
 for(i = 0; i < len; i++)
 {
  if(i % 10 == 0)
  {
   printf("\n");
  }
  printf("%d\t",arr[i].key);
 }
 printf("\n");
}

int getIndex(HNode arr[],int d)
{
 int result = 0;
 result = d % LEN;
 //如果冲突了
 while(arr[result].flag == 1)
 {
  result = (result + 1) % LEN;
 }
 return result;
}
//查找元素,查找成功返回1,否则返回0
int search(HNode arr[],int d)
{
 int circle = 0;
 int index = 0;
 index = d % LEN;
 while(arr[index].key != d)
 {
  if((circle == 1) && (index == d % LEN))
   break;
  index = (index + 1) % LEN;
  if(index >= LEN -1)
  {//已经扫描到尾了
   circle++;
  }
 }
 if(arr[index].key == d)
 {
  return 1;
 }
 return 0;
}

运行结果:

/*博主寄语:如若发现错误,望指出,谢谢*/