【问题标题】:Pointer error when deleting duplicates in a Linked List [duplicate]删除链接列表中的重复项时出现指针错误[重复]
【发布时间】:2021-05-04 06:29:15
【问题描述】:

我想从链接列表中删除所有重复项。我知道 GeeksForGeeks 上有一个与我的非常相似的确切程序,我可以使用它,但我想了解为什么我的程序不起作用。

代码:

class Node {
    public:
        int data;
        Node *next;
 
};

void removeDuplicatesAlpha(Node* start)
{
    Node* ptr1 = start;
    Node* ptr2 = NULL;
    Node* dup = NULL;
    int i = 0;

    /* Pick elements one by one */
    while (ptr1 != NULL && ptr1->next != NULL)
    {
        ptr2 = ptr1->next;
        //0 1 2 3 4
        /* Compare the picked element with rest
           of the elements */
        while (ptr2 != NULL && ptr2->next != NULL)
        {
            cout << i;
            i++;

            /* If duplicate then delete it */
            if (ptr1->data == ptr2->data)
            {
                /* sequence of steps is important here */
                dup = ptr2;
                ptr2 = ptr2->next;
                delete(dup);
            }
            else /* This is tricky */
                ptr2 = ptr2->next;
        }
        ptr1 = ptr1->next;
    }
}

int main()
{
    Node* head = NULL;

    push(&head, 3);
    push(&head, 3);
    push(&head, 20);
    push(&head, 14);
    push(&head, 9);
    push(&head, 20);
    push(&head, 20);

    printList(head);

    //removeDuplicates(head);
    removeDuplicatesAlpha(head);

    printList(head);

    deleteList(&head);

    return 0;
}

我最后打印的是 4。

这是错误:抛出异常:读取访问冲突。 ptr2 为 0xDDDDDDDD。

如果这是一个愚蠢的问题,我很抱歉,但我刚刚开始使用 C++ 中的数据结构。

【问题讨论】:

标签: c++ pointers data-structures


【解决方案1】:
            dup = ptr2;
            ptr2 = ptr2->next;
            delete(dup);

这会删除Nodes 之一。

如果您查看 Node 类中的内容,您会看到每个 Node 都有一个 next 指针,该指针链接到列表中的下一个节点。

上面的代码删除了实际的Node,但它对链表中的next 指针没有任何作用。链表中前面的Node:它的next 仍然指向这个Node。你只需deleted 这个Node。它不再存在。尝试使用和取消引用以前的 Node 的 next,即指向 deleted Node 的行为未定义。这一定是您崩溃的原因。

您需要更新您的逻辑,以便相应地更新链接列表中的next 指针。

【讨论】:

  • 如果代码在其他方面是正确的,唯一需要修复的是将ptr2 = ptr2-&gt;next更改为ptr1 = ptr2-&gt;next。这样你就可以让前一个指针指向被删除的节点,然后指向下一个。
  • 我知道代码删除了实际的节点,但它确实删除了我想忽略的节点,因为我将 ptr2 更改为指向我删除的节点。我在想象这样的事情: ptr2 -> data1, ptr2.next ptr2.next -> data2, ptr2.next.next dup = ptr2; ptr2 = ptr2-&gt;next; delete(dup); ptr2->data2, ptr2.next.next
  • 您可以将 ptr1、ptr2 设置为您想要的任何值。这不会对实际的链表节点做任何事情。 C++ 不能以这种方式工作。
  • 您需要更改指向您删除的节点的节点的下一个指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2013-10-19
相关资源
最近更新 更多