0
点赞
收藏
分享

微信扫一扫

线性探测法的查找函数

 线性探测法的查找函数_散列表

 

裁判测试程序样例:

#include <stdio.h>

#define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */
typedef int ElementType; /* 关键词类型用整型 */
typedef int Index; /* 散列地址类型 */
typedef Index Position; /* 数据所在位置与散列地址是同一类型 */
/* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */
typedef enum { Legitimate, Empty, Deleted } EntryType;

typedef struct HashEntry Cell; /* 散列表单元类型 */
struct HashEntry{
ElementType Data; /* 存放元素 */
EntryType Info; /* 单元状态 */
};

typedef struct TblNode *HashTable; /* 散列表类型 */
struct TblNode { /* 散列表结点定义 */
int TableSize; /* 表的最大长度 */
Cell *Cells; /* 存放散列单元数据的数组 */
};

HashTable BuildTable(); /* 裁判实现,细节不表 */
Position Hash( ElementType Key, int TableSize )
{
return (Key % TableSize);
}

#define ERROR -1
Position Find( HashTable H, ElementType Key );

int main()
{
HashTable H;
ElementType Key;
Position P;

H = BuildTable();
scanf("%d", &Key);
P = Find(H, Key);
if (P==ERROR)
printf("ERROR: %d is not found and the table is full.\n", Key);
else if (H->Cells[P].Info == Legitimate)
printf("%d is at position %d.\n", Key, P);
else
printf("%d is not found. Position %d is returned.\n", Key, P);

return 0;
}

/* 你的代码将被嵌在这里 */

 线性探测法的查找函数_散列表(哈希表)_02

 

1 Position Find( HashTable H, ElementType Key )
2 {
3 int HashPos = Hash(Key, H->TableSize);
4 int Pre; //Pre表示初始时HashPos的前一个位置
5 (HashPos-1 >= 0) ? (Pre = HashPos-1) : (Pre = (HashPos-1)+H->TableSize);
6
7 /* 是空位或者遍历完哈希表中的数组时,跳出循环 */
8 for(; H->Cells[HashPos].Info != Empty && HashPos != Pre; HashPos = (HashPos+1)%H->TableSize)
9 if(H->Cells[HashPos].Data == Key && H->Cells[HashPos].Info == Legitimate)
10 return HashPos;
11
12 if(H->Cells[HashPos].Info == Empty) /* 如果此时的位置是一个空位 */
13 return HashPos;
14 else /* 非空位,把数组遍历完了 */
15 return ERROR;
16 }

 


举报

相关推荐

0 条评论