哈希表的构建实例

已知一组关键字为{19,14,23,01,68,20,84,27,55,11,10,79},按照哈希函数H(key) = key MOD 13和链地址法处理冲突构造哈希函数。

#include <stdio.h>
#include <stdlib.h>
#define hashSize 12

typedef struct key{
	int data;
	struct key *nextKey;
}keyList;

int main()
{
	int key[] = {19,14,23,01,68,20,84,27,55,11,10,79};
	keyList* p1 = NULL;
	keyList hashTable[hashSize];
	for(int i = 0;i<hashSize;i++)
		hashTable[i].nextKey = NULL;
		
	//构建哈希表 
	for(int i = 0;i<hashSize;i++)
	{
		int j = key[i]%13;//哈希函数 
		if(hashTable[j].nextKey == NULL) 
		{
			//如果当前地址未被占用,则将关键字插入当前指针指向的链表
			hashTable[j].nextKey = (keyList*)malloc(sizeof(keyList));
			hashTable[j].nextKey->data = key[i];
			hashTable[j].nextKey->nextKey = NULL;
		}else{
			//如果当前地址已被占用,则使用链表的尾项插入当前关键字 
			keyList *p = (keyList*)malloc(sizeof(keyList));
			p->nextKey = hashTable[j].nextKey->nextKey;
			p->data = key[i];
			hashTable[j].nextKey->nextKey = p;
		}
	}
	
	//输出hashTable[hashSize]的每个数组中元素指向的链表的个数 
	int num[12] = {0};
	for(int i = 0;i<12;i++)
	{
		while(hashTable[i].nextKey)
		{
			hashTable[i].nextKey = hashTable[i].nextKey->nextKey;
			num[i]++;
		}
		printf("%d  ",num[i]);
	}

	return 1;	
} 

程序输出哈希表中每个数组含有的链表元素个数如下:

0  4  0  2  0  0  2  1  0  0  2  1
--------------------------------
Process exited after 0.064 seconds with return value 1
请按任意键继续. . .

关键字构造所得哈希表如下:

 

posted @ 2019-08-29 10:17  昨夜昙花  阅读(27)  评论(0)    收藏  举报