已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法

[20221216]已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一一个字母在字母表中的序
号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法
[注意:必须使用print函数输出输出关键字,不得使用printf]。
哈希表的类型HashTable定义如下:
#define SUCCESS
#define UNSUCCESS
#define DUPLICATE -1
typedef char StrkeyType[4];
typedef struct {
StrKeyType key; //关键字项
int
tag;
//标记0:空; 1:有效; -1:己删除
void *any;
//其他信息
} RcdType2;
typedef struct {
RcdType2 *rcd;
//存储空间基址
int
size;
//哈希表容量
int
count; // 表中当前记录个数
i HashTable;
实现下列函数:
void PrintKeys(HashTable ht, void(*print)(StrKeyType));
/*依题意用print输出关键字*/
函数输入举例:
0    1     2      3      4   5  6  7  8      9       10
            YZ   CO                          -KR
上述哈希表中只有两个关键字: YZ和CO。位置10的关键字前面有“”号,表示该关键字已被删除。
注意:
对于上述关键字,必须先使用print函数打印c0,然后打印Yz, 即结果为: COYZ
 

#include "allinclude.h"  //DO NOT edit this line
void PrintKeys(HashTable ht, void(*print)(StrKeyType)){
/*请调用形参中的print函数输出关键字 */


  int i,j;
  int k;
  int h=ht.count;
  StrKeyType *t; 
  StrKeyType e;
  t=(StrKeyType *)malloc((sizeof(StrKeyType ))*h);
  for(i=0,j=0;i<ht.size;i++)//遍历整个哈希表
  {
     if(ht.rcd[i].tag==1)
     {
        t[j][0]=ht.rcd[i].key[0];//复制key
        t[j][1]=ht.rcd[i].key[1];
        t[j][2]=NULL;//不能忘记此处要置为空
        t[j][3]=NULL;
        j++;
     }
  }
   k=j-1;//数组长度
  int change;
  int lastChange=k;
  for(i=k;i>0&&lastChange!=0;i--)
  {
    change=0;
    for(j=0;j<lastChange;j++)
    {
       if(t[j+1][0]<t[j][0])//若i+1比i小;
     {
        e[0]=t[j][0];
        e[1]=t[j][1];

        t[j][0]=t[j+1][0];//小的到前面去
        t[j][1]=t[j+1][1];

        t[j+1][0]=e[0];
       t[j+1][1]=e[1];  
        change=j;
     }
    }
    lastChange=change;
  }
  for(i=0;i<=k;i++)
     print(t[i]);

  }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来回答你的问题。 首先,哈是一种通过哈函数将键映射到索引的数据结构。对于给定的键,哈函数将其转换为索引,然后将值存储在该索引处。哈函数的好坏直接影响哈的性能。 接下来,我来为你介绍如何用 C 语言构建哈长为 16,用线性探测处理冲突,哈函数为 H(key) = key mod 13。 首先,我们需要定义一个哈结构体,如下所示: ``` #define TABLE_SIZE 16 typedef struct { int key; int value; } HashNode; typedef struct { HashNode nodes[TABLE_SIZE]; } HashTable; ``` 其,`HashNode` 结构体示哈的一个键值对,`HashTable` 结构体示整个哈。 接下来,我们需要实现哈函数 `H(key) = key mod 13`,代码如下所示: ``` int hash(int key) { return key % 13; } ``` 然后,我们需要实现插入操作,代码如下所示: ``` void insert(HashTable* table, int key, int value) { int index = hash(key); int i = index; do { if (table->nodes[i].key == 0) { table->nodes[i].key = key; table->nodes[i].value = value; return; } i = (i + 1) % TABLE_SIZE; } while (i != index); } ``` 其,`index` 示键的哈值,`i` 示当前索引,`do while` 循环用于处理冲突,如果当前索引为空,则将键值对插入到该位置。 最后,我们需要实现查找操作,代码如下所示: ``` int lookup(HashTable* table, int key) { int index = hash(key); int i = index; do { if (table->nodes[i].key == key) { return table->nodes[i].value; } i = (i + 1) % TABLE_SIZE; } while (i != index); return -1; } ``` 其,`index` 示键的哈值,`i` 示当前索引,`do while` 循环用于处理冲突,如果当前索引的键等于给定的键,则返回该键对应的值。 以上就是用 C 语言构建哈长为 16,用线性探测处理冲突,哈函数为 H(key) = key mod 13 的实现方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值