C语言实现哈希表:hashtable.txt解析

需积分: 0 32 下载量 10 浏览量 更新于2024-08-05 收藏 3KB TXT 举报
"本文档提供了一个C语言实现的哈希表,主要包含了哈希表的结构定义、哈希函数以及插入元素的函数。哈希表的大小被限制为128,每个元素由键(key)和值(value)组成,并且支持释放值的回调函数。" 在计算机科学中,哈希表是一种数据结构,它允许我们通过键来快速查找、添加和删除元素。哈希表的工作原理是将键通过一个哈希函数转换为一个索引,然后在这个索引位置存储或查找元素。哈希冲突是哈希表中常见的问题,即不同的键可能会被映射到相同的索引。解决冲突的方法有开放寻址法、链地址法等。 在这个实现中,哈希表的结构定义如下: 1. `struct kv` 代表单个键值对,包含以下字段: - `char* key`:保存键的指针,用于标识元素。 - `void* value`:保存值的指针,可以存储任何类型的数据。 - `void(*free_value)(void*)`:一个可选的回调函数指针,用于在删除元素时释放值所占用的内存。 - `struct kv* next`:指向哈希冲突时链表中的下一个元素。 2. `typedef struct htable` 是哈希表的整体结构,包含以下字段: - `struct kv** table`:一个二维数组,实际存储键值对的指针,数组大小为MAX_TABLE_SIZE(128)。 哈希函数 `hash_33` 使用了DJB2哈希算法,它将输入字符串的每个字符与当前哈希值进行位操作,生成一个新的哈希值。这种方法简单高效,但可能产生较多的冲突。 `hash_table_create` 函数用于创建一个新的哈希表,它首先分配一个哈希表结构,然后分配一个大小为MAX_TABLE_SIZE的二维数组来存储键值对的指针。如果内存分配失败,函数会释放已分配的内存并返回NULL。 `hash_table_put` 函数负责将键值对插入到哈希表中。首先,它通过哈希函数找到对应的索引,然后遍历该索引下的链表以查找是否存在相同的键。如果找到,就更新键值对的值和释放值的回调函数;如果没找到,就在链表末尾新建一个键值对节点。这个函数同样处理了哈希冲突的情况。 这个简单的哈希表实现可以作为理解哈希表工作原理的基础,并且可以用于简单的项目中。然而,对于大规模数据和性能要求较高的应用,可能需要更复杂的哈希函数和冲突解决策略,以及动态调整表大小的能力。

package 作业5; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.; import java.io.File; import java.util.HashMap; import java.util.Scanner; import java.io.File; import java.util.HashMap; import java.util.Scanner; public class Example13_7{ public static void main( String args []){ WindowWord win = new WindowWord(); win.setTitle("英﹣汉小字典"); } } class WindowWord extends JFrame{ JTextField inputText,showText; WordPolice police; public WindowWord(){ setLayout(new FlowLayout()); inputText = new JTextField(6); showText = new JTextField(6); showText.setColumns(15); add(inputText); add(showText); police = new WordPolice(); police.setView(this); inputText.addActionListener(police); setBounds(100,100,400,280); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class WordPolice implements ActionListener { WindowWord view; HashMap<String,String>hashtable; File file = new File ("E:\JAVA\上机\作业5\cet4.txt"); Scanner sc = null ; WordPolice () { hashtable = new HashMap< String,String >(); //System.out.println(hashtable.size()); try { sc = new Scanner ( file ); //System.out.println(sc); while (sc.hasNext ()) { String englishWord = sc . next (); String chineseWord = sc . next (); hashtable . put ( englishWord , chineseWord ); } HashMap<String,String> reversedHashtable = new HashMap<String,String>(); for (String key : hashtable.keySet()) { String value = hashtable.get(key); reversedHashtable.put(value, key); } hashtable.putAll(reversedHashtable); } catch(Exception e ) {} } public void setView(WindowWord view) { this.view = view; } public void actionPerformed(ActionEvent e) { String inputWord = view.inputText.getText (); if(hashtable.containsKey(inputWord)) { String outputWord = hashtable.get ( inputWord ); view.showText.setText (outputWord ); } else { String chineseWord = inputWord; for (String key : hashtable.keySet()) { String value = hashtable.get(key); if (value.equals(chineseWord)) { view.showText.setText(key); return; } } for (String value : hashtable.values()) { if (value.equals(inputWord)) { String outputWord = hashtable.get(value); view.showText.setText(outputWord); return; } } view.showText.setText ("没有此单词"); } } }我在输入框输入“书”,但结果是没有此单词,但是输入“book”,结果是“n.书,书籍”,如何解决

2023-05-24 上传