- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 语言的项目,我需要用链表创建一个链式哈希表。实际上,正如我所见,它是一个以链表为节点的链表。所以哈希表中每个表项中每个节点的数据结构应该是:
typedef struct node {
int value;
int counter;
struct node *next;
} t_listnode;
则应包含上述节点的哈希表如下:
typedef struct {
t_listnode *head;
t_listnode *tail;
} t_htentry;
我已经耗尽了我的小脑袋(第一次接触链表)并且不知道如何创建哈希表以及如何在每个条目中输入数据。任何帮助将不胜感激。
谢谢!
最佳答案
此答案假定您使用的是外部链表和内部链表:
首先,为了让您的生活更轻松,您应该为您的内部链表节点
制作一些方法:
insert()
:迭代到链表末尾,添加新节点find()
:遍历列表,看看你的值是不是你要找的接下来,您需要为哈希表实现相关方法:
get()
or find()
:将要查找的元素散列得到外链表中的索引,然后遍历内链表在该索引处列出以找到您要查找的元素put()
或 insert()
:散列您要查找的元素以获得外部链表中的索引,您将在其中附加到该索引处的内部链表的末尾对于哈希表最重要的是,您需要创建hash()
函数。在这种情况下,由于您的数据看起来是 int
,因此您的散列函数应该接受一个 int,然后将该 int 散列到外部链表中的给定位置。
由于您使用链表来表示哈希表的外部结构,因此您肯定希望创建一个 at()
方法来遍历外部链表(t_htentry
) 并返回指向内部链表索引的指针(在您的例子中,是一个 t_listnode
节点)。
示例:
我们想将 10、201、302 添加到我们的哈希表中。
第一步是将 t_htentry* hashtable[PRIME_NUMBER]
预分配为质数大小——也就是说,假设我们从一个大小为 5 的数组开始(数组中的每个索引都表示为通过 [ ]
)。 t_listnode* head
已经在每个 t_htentry*
中,(每个 t_htentry*
由 ( )
,头节点用*
表示,尾节点用t
表示)。
0 1 2 3 4 -- indexes
[(*)] [(*)] [(*)] [(*)] [(*)] -- t_htentry*[] with t_listnode* head in each index
| | | | |
v v v v v -- pointer
(t) (t) (t) (t) (t) -- t_listnode* tail
第二步是散列我们的第一个数据点 - 10。
int idx = hash(10); //-> 2
第三步是在我们的外部列表中定位idx
(2)。 hashtable[idx]
将为我们提供一个恒定的时间查找!
第四步是现在将具有数据点 5 的节点附加到该列表。
// append value to hashtable[idx] (where "next" points to TAIL)
insert(hashtable[idx], 5);
[(*)] [(*)] [(*)] [(*)] [(*)]
| | | | |
| | v | |
| | (5) | |
| | | | |
v v v v v
(t) (t) (t) (t) (t)
第五步,我们现在继续我们的下一个数据点,201。假设 201 哈希值也为 idx = 2
。 (从现在开始,我将省略为所有没有任何数据的索引绘制 [(t)]
,但请注意它们仍然存在。)
idx = hash(201); //-> 2
t_listnode * spot = positionAt(hashtable, idx);
insert(spot, 201);
[(*)] [(*)] [(*)] [(*)] [(*)]
|
v
(5)
|
v
(2)
|
v
(t)
下一步,我们将移至最后一个数据点 302。假设 302 哈希为 idx = 0
。
idx = hash(302); //-> 0
t_listnode * spot = positionAt(hashtable, idx);
insert(spot, 302);
[(*)] [(*)] [(*)] [(*)] [(*)]
| |
v v
(302) (5)
| |
v v
(t) (2)
|
v
(t)
在哪里,
hash
看起来像 these examples 之一
插入
看起来像
void insert(t_htentry * bucket, int value) {
// copy spot to a new t_listnode* and iterate until spot->next is NULL
// (i.e., t_htentry* tmp = bucket; tmp = bucket->head->next)
// create a new node with t_listnode->value set to value
// set the current spot's next to the new node
// set the new node's next to the TAIL node
}
找到
的样子
bool find(hashtable, int value) {
// hash "value" and go to hashtable[idx] as before
// iterate through hashtable[idx]'s linked list as before using a copy
// of that t_htentry*.
// if the node that you're on has ->value == value, return true
// else continue until you're at the end of the list, and return false
}
此实现的性能将为 find
和 insert
摊销 O(1)。了解原因很重要。
关于c - C中链表的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683895/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!