C语言数据结构--哈希表

#include <stdio.h>
#include <stdlib.h>

typedef struct  //元素类型定义
{
	int key;//关键字
	int hi;	//冲突次数
}DataType;

typedef struct //哈希表的类型
{
	DataType *data;
	int tableSize; //哈希表的长度
	int curSize;   //关键字的个数
}HashTable;

void CreateHashTable(HashTable *H, int m, int p, int hash[], int n);
void DisplayHash(HashTable H, int m); //显示哈希表
int SearchHash(HashTable H, int k);
int main(void)
{
	int hash[] = { 23,35,12,56,123,39,342,90 };
	int m = 11, p = 11, n = 8, pos;
	int k ;
	HashTable H;
	CreateHashTable(&H, m, p, hash, n);
	DisplayHash(H, m);
	k = 123;
	pos = SearchHash(H, k);
	printf("关键字%d在哈希表中的位置%d\n", k, pos);
	system("pause");
	return 0;
}

//创建哈希表
void CreateHashTable(HashTable *H, int m, int p, int hash[], int n)
{
	int i, sum, addr, di, k = 1;
	//为哈希表分配存储空间
	(*H).data = (DataType*)malloc(m * sizeof(DataType));
	if (!(*H).data)
		exit(-1);
	for (i = 0;i < m;i++) //初始化哈希表
	{
		(*H).data[i].key = -1;
		(*H).data[i].hi = 0;
	}
	for (i = 0;i < n;i++)//求哈希表函数地址并处理冲突
	{
		sum = 0;//冲突的次数
		addr = hash[i] % p;//利用余数法求哈希函数地址
		di = addr;
		if ((*H).data[addr].key == -1)
		{
			(*H).data[addr].key = hash[i];
			(*H).data[addr].hi = 0;
		}
		else   //利用线性探测在哈希法处理冲突
		{
			do
			{
				di = (di + k) % m;
				sum += 1;
			} while ((*H).data[di].key != -1);
			(*H).data[di].key = hash[i];
			(*H).data[di].hi = sum + 1;
		}
	}
	(*H).tableSize = m;
	(*H).curSize = n;
}

void DisplayHash(HashTable H, int m) //显示哈希表
{
	int i;
	printf("哈希表地址:");
	for (i = 0;i < m;i++)
		printf("%-5d", i);
	printf("\n");
	printf("关键字Key:");
	for (i = 0;i < m;i++)
		printf("%-5d", H.data[i].key);
	printf("\n");
	printf("冲突次数");
	for (i = 0;i < m;i++)
		printf("%-5d",H.data[i].hi);
	printf("\n");
}

//在哈希表中查找关键字K的位置
int SearchHash(HashTable H, int k)
{
	int d, dl, m;
	m = H.tableSize;
	d = dl = k * m;
	while (H.data[d].key != -1)
	{
		if (H.data[d].key == k)
			return d;
		else
			d = (d + 1) % m;
		if (d == dl)
			return 0;
	}
	return 0;
}
 
 


猜你喜欢

转载自blog.csdn.net/zjy900507/article/details/80695735