访问动态分配列表中的元素
Accessing element in a dynamic-allocated list
所以我有这段代码重新创建了一个没有STL的单独链接的哈希表(我的作业禁止这样做(。不幸的是,我无法修改使用的任何结构。TElem 是一个 int 值,NULL_TELEM 是一个识别空元素的值,elem 是一个值。
如果我尝试添加更多具有相同 hashValue 的数字,例如 7777 和 8777,如果哈希函数返回 %100 的数字,则会出现我的问题(标记为注释的 while 是可以正确访问内存的地方(:
我怎样才能让它工作?
(更新(
为方便起见,我将添加一个可复制粘贴的代码,包括以前的功能(全部在一个文件中(:
#include<iostream>
#include<assert.h>
typedef int TElem;
#define NULL_TELEM -111111
int hashFunction(TElem elem){
return elem%100; //key: 1905, it returns 5
};
struct Node
{
TElem val=NULL_TELEM;
Node* next;
};
class Book {
private:
unsigned int m;
Node* nodes;
public:
Book() {
m = 0;
this->nodes = new Node[100];
for(int i=0; i<100; i++)
{
nodes[i].val=NULL_TELEM;
nodes[i].next=nullptr;
}
};
bool add(TElem elem){
if(elem<1000 || elem>9999)
return false;
int hashValue = hashFunction(elem);
if(nodes[hashValue].val==elem)
return false;
if(nodes[hashValue].next==nullptr && nodes[hashValue].val==NULL_TELEM)
{
nodes[hashValue].val = elem;
m++;
return true;
}
Node* b1=new Node;
b1=nodes[hashValue].next;
while (b1->val != elem && b1->val != NULL_TELEM) //Here?? Exactly at this while
b1=b1->next;
if (b1->val != elem)
{
b1->next->val = elem;
b1->next->next = nullptr;
m++;
return true;
}
return false;
};
};
int main()
{ Book b;
assert(b.add(7777)==true);
assert(b.add(8777)==true); //this is where it doesn't work
return 0;}
在此代码段中:
Node* b1=new Node;
b1=nodes[hashValue].next;
while (b1->val != elem && b1->val != NULL_TELEM) //Here?? Exactly at this while
b1=b1->next;
if (b1->val != elem)
{
b1->next->val = elem;
b1->next->next = nullptr;
m++;
return true;
}
添加到特定链表的位置有几个问题。一旦为b1
分配内存,就会覆盖该指针并泄漏内存。插入的逻辑也存在问题。
以下代码片段插入到与哈希值对应的链表中,并且仅在elem
尚未插入时才插入它。我删除了NULL_ELEM
的检查,因为这似乎是多余的。
auto b1 = nodes + hashValue;
while (b1->next && b1->val != elem) // the check for next is very important
b1=b1->next;
if (b1->val != elem)
{
b1->next = new Node{elem, nullptr};
m++;
return true;
}
这是一个演示。如果我正确理解问题,它应该有效。至少它不再出现段错误。
相关文章:
- C++如何通过用户输入删除列表元素
- 访问类lintalizer列表中的结构元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从C++中的对列表中访问特定元素
- 访问动态分配列表中的元素
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 删除列表 c++ 中的最后 3 个元素
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 有什么方法可以将元素添加到列表中,如图所示?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- (C++)如何创建一个函数来接收两个排序的链表并返回出现在两个列表中的第三个元素列表
- 刷新元素列表视图 QML
- SQLite:通过100K元素列表选择IN
- 解析字符串以创建元素列表
- 向vector添加可变大小元素列表的语法糖
- 是否可以为通用元素列表创建排序