c - 我将如何确定我的哈希表中的某个索引是否还没有值?
问题描述
我正在尝试创建一个程序,该程序读取一个充满字典中单词的文件,然后将每个单词存储在哈希表中,我已经有一个哈希函数,例如哈希函数返回一个索引123
我将如何能够确定该索引是否还没有值,否则如果某个索引具有值,我应该将这个词作为列表的新头部还是应该将它添加到列表的末尾?我是否应该首先将整个数组初始化为“NULL”之类的东西,因为如果一个变量没有被初始化,它包含垃圾值,那么这对结构中的数组是否同样有效。
typedef struct node
{
char word[LENGTH + 1];
struct node *next;
}
node;
// Number of buckets in hash table
// N = 2 ^ 13
const unsigned int N = 8192;
// Hash table
node *table[N];
这是我的代码的一部分 LENGTH 在上面定义为 45..
解决方案
我将如何确定该索引是否还没有价值
表中的“槽”是链表。table
存储指向这些链表头节点的指针。如果该指针为NULL
,则列表为空,但您不需要将其设为特殊情况:当您查找一个单词时,只需遍历列表,而指向下一个节点的指针不为空。如果指向头节点的指针为空,则您的步行会提前停止,仅此而已。
我应该把这个词作为列表的新标题还是应该将它添加到列表的末尾?
应该没关系。节点上的单个列表应该很短。哈希表的想法是将所有单词的线性搜索转变为平均W
对单词进行更快的线性搜索。W/N
如果您看到您的表只有几个长列表,那么您的哈希函数并不好。
您必须遍历列表一次以确保您不会插入重复项,因此您可以在最后插入。或者您可以尝试保持每个链接列表按字母顺序排序。选择一种方法并坚持下去。
我是否应该首先将整个数组初始化为“NULL”之类的东西,因为如果一个变量没有被初始化,它包含垃圾值,那么这对结构中的数组是否同样有效。
是的,请将您的头节点指针数组初始化为NULL
,以便哈希表处于定义状态。(如果您的数组在文件范围内,或者static
,表应该已经初始化为空指针,但明确初始化并没有什么坏处。)
推荐阅读
- powershell - 尝试连接到 PowerShell 中的 SkypeOnlineConnector 模块时出现 Accesstoken 错误
- javascript - 如何将图像从 cli stdout 加载到缓冲区并插入到画布
- ansible - aws_ec2 库存插件:基于 AWS 标签创建主机变量
- android - Android shareCompat 回调?
- c# - 读取时如何忽略 CSV 中的空行
- python - Python Regex 从句子中提取地址和旅行时间?
- java - brew cask install 采用openjdk11后缺少java源文件
- jquery - 是否有任何原因导致新数据未呈现
- sql - 如何快速查看表中哪些列有数据?
- c# - 第三次或第二次使用 DropDownlist 时出现以下错误!“未能加载视图状态正在加载必须..”