首页 > 解决方案 > 相同的地址被存储在链表的头部

问题描述

我正在尝试在 C++ 中实现哈希表。所以为此,我创建了一个链表数组。但是我在维护每个列表的头部时遇到了问题。

我有一个名为linked_list ContactList,列表的数组在另一个名为的类中定义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;

标签: c++linked-list

解决方案


这里的问题是您正在创建一个堆栈变量,然后将其地址添加到列表中。然后也许您更改值并再次添加它。

为了实现您想要的行为,您必须在每个条目处创建新实例。为此,您可以使用new创建不同的联系人。

  Contact* contact = new Contact;

更好的是使用智能指针来管理内存并确保没有内存泄漏。

std::unique_ptr<Contact> contact = std::make_unique<Contact>();

推荐阅读