⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.cpp

📁 一个简单的HASH表的建立与HASH过程演示.
💻 CPP
字号:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>

#define N 26             //数据元素个数
  
int hashsize[]={27,49};  //哈希表容量递增表,一个合适的素数序列
int m=0;                 //哈希表表长,全局变量  

typedef long KeyType;    //设关键字为长整型

struct ElemType{         //数据元素(记录)类型
  KeyType key;
};

struct HashTable{
  ElemType *elem;        //数据元素基址
  int count;             //当前元素个数
  int sizeindex;         //hashsize[sizeindex]为当前容量
};

int InitHashTable(HashTable &H) 
{ //构造一个空的哈希表
  int i;
  H.count=0;
  H.sizeindex=0; 
  m=hashsize[0];
  H.elem=(ElemType *)malloc(m*sizeof(ElemType));
  if(!H.elem)
	   return -1;
  for(i=0;i<m;i++)
	  H.elem[i].key=0;
   return 1;
}
void DestroyHashTable(HashTable &H)
{ //销毁哈希表
  free(H.elem);
  H.elem=NULL;
  H.count=0;
  H.sizeindex=0;
}

unsigned Hash(KeyType K)
{ //哈希函数
  return K%m;
}
 
void collision(int &p,int d)
{ //开放定址法处理冲突
  p=(p+d)%m;
}
int SearchHash(HashTable &H,KeyType K,int &p,int &c)
{ //在哈希表中查找关键字为K的元素,若查找成功,以p指示待查找数据元素
  //在表中的位置,并返回1;否则,以p指示插入位置,并返回0.
  //c用以计冲突次数.
  p=Hash(K);
  while(H.elem[p].key!=0&&(K!=H.elem[p].key)){
   c++;
   if(c<m)
	   collision(p,c);
   else
	  break;
  }
  if(K==H.elem[p].key)
	  return 1;
  else 
	 return 0;


}
int InsertHash(HashTable &H,ElemType e)
{ //查找不成功时插入数据元素e到哈希表H中,并返回1;
  //若冲突次数过大,则返回0.
  int c,p;
  c=0;
  if(SearchHash(H,e.key,p,c))
	  return 10;
  else if(c<hashsize[H.sizeindex]/2){
    H.elem[p]=e;
	++H.count;
	return 1;
  }
  else
	return 0;
}

void print(int p,ElemType r)
{ //打印哈希表
  printf("address=%d: %d\t\t",p,r.key);
}

void TravelHash(HashTable H,void(*vi)(int,ElemType))
{ //按哈希地址的顺序遍历哈希表
  int i;
  printf("\t\t  HashAddress 0-----%d\n",m-1);
  for(i=0;i<m;i++){
	  if(H.elem[i].key!=0)
		  vi(i,H.elem[i]);
	  if((i+1)%2==0)putchar(10);
	}
}

void main()
{
   ElemType r[N];
   HashTable h;
   int i;
   int j;
   for(i=0;i<N;i++)r[i].key=20042148+i;
   InitHashTable(h);
   for(i=0;i<N;i++){
	//插入N个记录
    j=InsertHash(h,r[i]);
    if(j==10)
		//若记录已存在
		printf("HashTable has the %d elem.\n",r[i].key);
   }
   printf("\t\t    TraverHashTable:\n");
   TravelHash(h,print);  //遍历哈希表
   DestroyHashTable(h);  //销毁哈希表
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -