散列表(冲突用链表解决)

#include "stdafx.h"
#include<iostream>
#include<cmath>
using namespace std;
#ifndef _HashSsp_
struct ListNode;
typedef struct ListNode *Position;
struct HashTbl;
typedef struct HashTbl *HashTable;

HashTable InitializeTable(int TableSize);
void DestroyTable(HashTable H);
Position Find(int key, HashTable H);
void Insert(int key, HashTable H);
int Retrieve(Position P);
#endif // _HashSsp_
#define MinTableSize 10
struct ListNode
{
	int key;
	Position Next;
};

typedef Position List;

struct HashTbl
{
	int TableSize;
	List *TheLists;
};

int NextPrime(int n)
{
	if (n % 2 == 0) n++;               //1.排除掉偶数
	for (;; n += 2)
	{
		bool isPrime = 1;              //2.标志位
		for(int i=3;i*i<=n;i+=2)
			if (n%i == 0) {
				isPrime = 0;
				break;
			}
		if (isPrime)
			return n;
	}
}

HashTable InitializeTable(int TableSize)
{
	HashTable H;
	int i;

	if (TableSize < MinTableSize)
	{
		cout << "Table is too small";
		return NULL;
	}

	H = (HashTable)malloc(sizeof(HashTbl));                //1.初始化散列表地址
	if (H == NULL)
		cout << "out of space";
	H->TableSize = NextPrime(TableSize);                 //2.用素数初始化散列表大小
	H->TheLists = (List *)malloc(sizeof(List)*H->TableSize);       //3.申请结构指针数组的空间并给出地址
	if (H->TheLists == NULL)
		cout << "out of space";

	for ( i = 0; i < H->TableSize; i++)                //4.初始化每个链表表头
	{
		H->TheLists[i] = (List)malloc(sizeof(ListNode));
		if (H->TheLists[i] == NULL)
			cout << "out df space";
		else
			H->TheLists[i]->Next = NULL;
	}
	return H;
}

int Hash(int key, int tableSize)
{
	return key%tableSize;
}

Position Find(int key, HashTable H)
{
	Position P;
	List L;
	L = H->TheLists[Hash(key, H->TableSize)];       //1.算出是哪个槽
	P = L->Next;
	while (P != NULL&&P->key != key)              //2.链表查找操作
		P = P->Next;
	return P;
}

void Insert(int key, HashTable H)
{
	Position Pos, NewCell;
	List L;

	Pos = Find(key, H);                                     //1.先找有没有在表里面
	if (Pos == NULL)
	{
		NewCell = (Position)malloc(sizeof(ListNode));       //2.没有就新建一个地址存放
		if (NewCell == NULL)
			cout << "out od space";
		else {
			L = H->TheLists[Hash(key, H->TableSize)];      //3.插入到表头和第一个元素之间
			NewCell->Next = L->Next;
			L->Next = NewCell;
			NewCell->key = key;
		}
	}
}

int main()
{
	cout << NextPrime(15);
	while (1);
    return 0;
}

  

posted @ 2017-03-28 16:50  lineaar  阅读(498)  评论(0编辑  收藏  举报