#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; } }
平方探测法(此方法有缺陷如下图会陷入死循环,分离链表法更好)
最新推荐文章于 2023-08-10 08:00:00 发布