3

在导师的帮助下,我一直在研究我的链表实验室,但不幸的是不久前与他们失去了联系,我自己也无法解决这个问题。

我的第一个 while 循环一次遍历链表一个节点,然后进入第二个 while 循环,该循环遍历第二个节点并将其与第一个节点进行比较。这似乎工作正常。然而问题在于,当它删除一个成员时,它实际上会继续删除两个。它会删除它之前的那个,以及它应该删除的节点。

我已将问题隔离到 list.cpp 的第 80 行(如下)。我认为 cursorOne 的 link_field 指向光标 2 的链接字段正在删除两个光标之间的所有节点,这不是我想要的。

所以我想我应该让光标 1 的链接字段指向光标 1 的下一个链接字段?我感觉如此接近.. 这个实验室的困难部分已经完成,但我还没有得到最后一个 Eureka 时刻,但我已经看了很多。

这是程序:它应该是不言自明的。它使用节点类,然后使用列表类对其进行变异。

再想一想,我想我无法链接到 ideone.com 上的代码。所以我会尽量让这个尽可能简短,然后发布循环。这是节点list.cpp

      while(currentItem != NULL)
    {
        cout << "Enter Second Loop" << endl;
        cout << currentItem->data_field << " Curse 2" << endl;

        //compare it
        if (nodeToFindDuplicatesOf->data_field == currentItem->data_field)
        {

         //prev->next = current->next to delete
            // in order to delete only one, I must find a way to set the link_field of the previous node to cursor 1 to
            // the link field of the node that's to be deleted
            cout << nodeToFindDuplicatesOf->data_field << "being removed" << endl;
            predecessor = currentItem->link_field;
            delete currentItem;

            currentItem = nodeToFindDuplicatesOf; //set cursor2 to cursor1

        }
        currentItem = currentItem->link_field;
    }
    nodeToFindDuplicatesOf = nodeToFindDuplicatesOf->link_field;
    if (nodeToFindDuplicatesOf)
        currentItem = nodeToFindDuplicatesOf->link_field;
}

}

我的节点类中是否需要前一个节点指针?

4

1 回答 1

2

您定位错误的分析是正确的。要从列表中删除一个项目,您需要一个指向要删除的项目currentItem(又名cursorTwo)及其前身的指针。但是,您的cursorOne指针不是的前身cursorTwo,而是指向您要查找其副本的某个节点的指针。

要修复错误,首先为变量使用有意义的名称。cursorOne并且cursorTwo根本没有意义,它们的名字很可能是你错误的根源。为什么不叫他们nodeToFindDuplicatesOfand currentItem?(或者也许你可以想出更好的东西。)

然后你需要引入一个新的指针来跟踪currentItem.

currentItem需要删除时,设置link_field其前身的,然后delete currentItem(不NULL预先设置)。

于 2013-04-11T18:45:33.707 回答