6-25 线性探测法的查找函数 (50 分)

试实现线性探测法的查找函数。

函数接口定义:
Position Find( HashTable H, ElementType Key );
其中HashTable是开放地址散列表,定义如下:

#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; / 存放散列单元数据的数组 */
};
函数Find应根据裁判定义的散列函数Hash( Key, H->TableSize )从散列表H中查到Key的位置并返回。如果Key不存在,则返回线性探测法找到的第一个空单元的位置;若没有空单元,则返回ERROR。

裁判测试程序样例:
#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;

}

/* 你的代码将被嵌在这里 */
输入样例1:(注:-1表示该位置为空。下同。)
11
11 88 21 -1 -1 5 16 7 6 38 10
38
输出样例1:
38 is at position 9.
输入样例2:
11
11 88 21 -1 -1 5 16 7 6 38 10
41
输出样例2:
41 is not found. Position 3 is returned.
输入样例3:
11
11 88 21 3 14 5 16 7 6 38 10
41
输出样例3:
ERROR: 41 is not found and the table is full.

Position Find( HashTable H, ElementType Key )
{
    int p = Key % H->TableSize;
    int cnt = 0;
    while((H->Cells[p].Data != Key) && cnt <= H->TableSize && (H->Cells[p].Data != -1))
    {
        p++;
        cnt++;
        if(p == H->TableSize)
        {
            p = 0;
        }
    }
    if(cnt < H->TableSize)
    {
        return p;
    }
    return ERROR;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P-chanY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值