利用C语言建立哈希表查找图书

一.构建哈希函数的方法

  1. 直接地址法
  2. 除留余数法
  3. 平方取中法
  4. 折叠法
  5. 数值分析法

二.利用除留余数方法查找图书

#include
#include

#define MAXSIZE 5
#define NULLKEY -32768

typedef struct{
     
	char name[20];
	int number;
}book;

typedef struct{
     
	book *elem;
	int count;
}HashTable;

//初始化哈希表
int InitHashTable(HashTable &H)
{
     
	int i;
	H.elem = (book*)malloc(MAXSIZE*sizeof(book));
	if(!H.elem)exit(-2);
	H.count = MAXSIZE;
	for(i=0;i<MAXSIZE;i++)
	{
     
		H.elem[i].number=NULLKEY;
	}
	return 1;
}

//哈希函数
int Hash(int key)
{
     
	return key%MAXSIZE;
}

//插入关键字进入哈希表
void InsertHash(HashTable &H,book &key)
{
     
	int addr = Hash(key.number);
	while(H.elem[addr].number!=NULLKEY)
		addr = (addr+1)%MAXSIZE ;    //发生冲突,将关键字移向下一个储存地址
	H.elem[addr] = key;
}

//查找图书
int SearchHash(HashTable H,int key)
{
     
	int addr;
	addr=Hash(key);
	while(H.elem[addr].number!=key)                        //判断这个地址是否为所找书单
	{
     
		addr = (addr+1)%MAXSIZE;
		if(H.elem[addr].number==NULLKEY||addr==Hash(key))  //下一个地址为空或者循环一圈没有找到,返回错误
		{
     
			return -1;
		}
	}
	return addr;
 } 

int main()
{
     

	int i ,number,j;
	book s[MAXSIZE]={
     {
     "English",5},{
     "math",6},{
     "C",9},{
     "python",8},{
     "Chinese",7}};

	printf("书名           编号\n");
	for(i=0;i<MAXSIZE;i++)
		printf("%-7s  %7d\n",s[i].name,s[i].number);
	
	
	
	
	HashTable H;
	InitHashTable(H);
	for(i=0;i<MAXSIZE;i++)
	{
     
		InsertHash(H,s[i]);
	}
	printf("\n\n插入之后的哈希表为:\n\n");
	printf("书名           地址\n");
	for(i=0;i<MAXSIZE;i++)
		printf("%-7s  %7d\n",H.elem[i].name,i);


	printf("\n\n请输入要查找图书的编号:");
	scanf("%d",&number);
	j=SearchHash(H,number);
	printf("你查找的图书为:");
	printf("“%s”\n",H.elem[j].name);
	return 0;

}


你可能感兴趣的:(哈希表,hash,c语言,算法,哈希)