平方探测法(此方法有缺陷如下图会陷入死循环,分离链表法更好)

​
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
#define MaxTblSize 10000
typedef int ElementType;
typedef int Index;//散列地址
typedef Index Position;//数据存放位置
typedef enum{Legetimate,Empty,Deleted} EntryType;
typedef struct HashEntry Cell;
struct HashEntry {
	ElementType Data;
	EntryType Info;
};
typedef struct TblNode* HashTable;
struct TblNode {
	int TblSize;
	Cell* Cells;
};
int NextPrime(int N);//返回大于N的最小素数
HashTable CreateHashTable(int TblSize);
Position Hash(ElementType Key, int TableSize);
bool Insert(HashTable Table, ElementType Item);
int main()
{
	HashTable Table = CreateHashTable(1000);
	Insert(Table, 2086);
	Insert(Table, 2086);

}
HashTable CreateHashTable(int TblSize)
{
	HashTable Table = (HashTable)malloc(sizeof(struct TblNode));
	Table->TblSize=NextPrime(TblSize);

	Table->Cells = (Cell*)malloc(sizeof(struct HashEntry) * Table->TblSize);
	for (int i = 0; i < Table->TblSize; i++)
	{
		Table->Cells[i].Info = Empty;
	}
	return Table;
}
int NextPrime(int N)
{
	int i;
	if (N % 2 == 0)
		N = N + 1;
	else
		N = N + 2;
	while (N<=MaxTblSize)
	{
		for (i = (int)sqrt(N);i>2; i--)
		{
			if (N % i == 0)
				break;
		}
		if (i == 2)
			return N;
		else
			N = N + 2;
	}
}
Position Find(HashTable Table, ElementType Item)
{
	Position NewPosition, CurrentPosition;
	int Cnt=1;
	NewPosition = CurrentPosition = Hash(Item,Table->TblSize);
	while (Table->Cells[NewPosition].Info != Empty && Table->Cells[NewPosition].Data != Item)
	{
		if (Cnt % 2)
		{
			NewPosition = CurrentPosition - (Cnt * Cnt) / 4;
			while (NewPosition < 0)
			{
				NewPosition += Table->TblSize;
			}
			Cnt++;
		}
		else
		{
			NewPosition = CurrentPosition + (Cnt+1) * (Cnt+1) / 4;
			Cnt++;
			if (NewPosition >= Table->TblSize)
			{
				NewPosition = NewPosition % Table->TblSize;
			}
		}
	}
	return NewPosition;//此时有两种情况:1找到了   2所找位置为空

}
Position Hash(ElementType Key,int TableSize)
{
	int i;
	while (1)
	{
		for (i = (int)sqrt(TableSize); i >= 2; i--)
		{
			if (TableSize % i == 0)
				break;
		}
		if (i == 1)
			return Key%TableSize;
		else
			TableSize--;
	}

}
bool Insert(HashTable Table, ElementType Item)
{
	Position Aim = Find(Table, Item);
	if (Table->Cells[Aim].Info != Legetimate)
	{
		Table->Cells[Aim].Data = Item;
		Table->Cells[Aim].Info = Legetimate;
		return true;
	}
	else
	{
		printf("元素已经存在");
		return false;
	}
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值