相同的地址存储在链表的头部
Same address is getting stored in the head of a linked list
我正在尝试在C++中实现哈希表。为此,我创建了一个链表数组。但是我在维护每个列表的标题方面遇到了问题。
我有一个名为ContactList
的linked_list,列表的数组在另一个名为PhoneBook
的类中定义:
class ContactList {
public:
Contact *head;
void AddName(Contact *);
};
class PhoneBook {
public:
ContactList arr[100000];
};
它应该包含按以下方式定义的节点:
struct Contact {
int phone;
string name;
Contact *next;
};
AddName
函数应该遍历整个列表以找到具有相同编号的节点,如果找到该节点,则只需修改node.name
,否则将其添加到列表的末尾。我编写了以下代码来执行此操作:
void ContactList::AddName(Contact *contact){
bool flag = 0;
Contact *node = head;
if(node == NULL){
head = contact;
return;
}
...
}
对函数AddName
的调用如下所示:
Contact contact{queries[i].number, queries[i].name};
phonebook.arr[k].AddName(&contact);
但问题是,在每次调用时,参数contact
的地址都是相同的,因此相同的地址存储在每个索引的每个列表的头部。如何更改调用以分配新内存?还是我应该更改AddNew
函数中的某些内容?
编辑:我发现我没有分配新内存,所以我寻找解决方案并进行以下更改:
void ContactList::AddName(Contact contact){
bool flag = 0;
struct Contact *new_node = (struct Contact *) malloc(sizeof(struct Contact));
new_node->phone = contact.phone;
new_node->name = contact.name;
if(head == NULL){
head = new_node;
return;
}
但是现在我在以下行中收到分段错误:
new_node->name = contact.name;
这里的问题是您正在创建一个堆栈变量,然后将其地址添加到列表中。然后,也许您可以更改值并再次添加它。
要实现所需的行为,您必须在每个条目上创建新实例。为此,您可以使用new
创建不同的联系人。
Contact* contact = new Contact;
更好的是使用智能指针来管理内存并确保没有内存泄漏。
std::unique_ptr<Contact> contact = std::make_unique<Contact>();
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 尝试删除链表的头部或中间节点时出错
- 如何在全局函数中访问链表的头部和尾部
- 相同的地址存储在链表的头部
- 链表C++ 使用突变器更新头部的下一个时不保存
- 当链表是列表中唯一的节点时,删除链表的头部.单联
- 将链表的头部传递给函数时。为什么我们需要通过引用来传递它,例如在 push(node* &head, int key)
- 如何防止链表中的头部指针在迭代时被重新签名
- 复制双链表的构造函数,头部初始化问题
- 当插入到链表的头部时,与指针混淆