gpt4 book ai didi

c++ - 相同的地址被存储在链表的头部

转载 作者:行者123 更新时间:2023-11-30 04:48:57 25 4
gpt4 key购买 nike

我正在尝试用 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>();

关于c++ - 相同的地址被存储在链表的头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55613317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com