【问题标题】:How would I clear a linked list?我将如何清除链接列表?
【发布时间】:2012-04-20 10:05:02
【问题描述】:

我一直在尝试编写一个最短路径算法,dijkstras 算法,找到前两个顶点的最短路径就可以了。我在尝试清除链表和优先级队列时遇到了问题。

class llNode {
public:
    int id;
    int source;
    int weight;
    llNode* next;
    llNode(int key, int distance, int from) {
        id=key;
        weight=distance;
        source=from;
        next = NULL;
    }
};


class lList {
private:
    llNode* root;
    llNode* end;

    void clearAll(llNode* toClear);


public:
    lList() {
        root = NULL;
    }

    void add(llNode* toAdd) {
        if ( root == NULL) {
            root = toAdd;
            end = toAdd;
            return;
        }

        end->next = toAdd;
        end=end->next;
    }

    bool isFound(int key) {
        for(llNode* ii= root; ii != NULL ; ii=ii->next) {
            if ( ii->id == key) {
                return true;
            }
        }

        return false;
    }

    void clearAll();

};

void lList::clearAll() {
clearAll(root);
}

void lList::clearAll(llNode* toClear) {
if(toClear == NULL) {
    return;
}

clearAll(toClear->next);

toClear=NULL;

}

除了这些清晰的方法外,我还尝试简单地将 root 设置为 NULL,还尝试遍历列表并在每个元素上使用 delete。我必须幸运地使用这些方法中的任何一种。 Root 不断被设置为无效位置,我收到访问冲突错误。

有什么简单的我没看到的吗?我将如何从链表中删除每个元素?

【问题讨论】:

  • 既然你在处理指针,你可以让root.nextend.next都指向root

标签: c++ pointers linked-list shortest-path


【解决方案1】:

您需要遍历每个元素并将其删除 伪代码

Set pointer to root
While(pointer !=null)
{
  temp=pointer->next;
  delete[] pointer;
  pointer = temp;
}

【讨论】:

  • 请记住,您将指针分配给 temp,然后删除该指针。
  • @Eric 立即尝试。你应该为你的节点类实现一个析构函数
  • 谢谢谢谢谢谢!大声笑由于某种原因我无法弄清楚如何做到这一点!
【解决方案2】:

root 设置为NULL 将删除整个列表。

void lList::clearAll() {
     root = NULL;
}

你说你试过这个。在这种情况下,您的访问冲突是如何发生的?

注意:我的代码可能包含内存泄漏!您可能希望遍历列表并取消分配每个项目,除非使用其他机制恢复它们的内存。

【讨论】:

  • 设置root为NULL如何删除列表!
  • 它使列表为空。在isFound 中,任何输入都会返回false
  • 这绝对是错误的答案。仅仅因为丢失了对列表根目录的引用,您就在这里留下了悬空指针和内存泄漏以及各种令人讨厌的东西,更不用说“删除”这个词是不正确的了。更准确地说,您丢失了您的列表
  • OP 的问题是访问冲突,而不是内存泄漏。在我们修复所有其他错误之前,让我们先尝试解决这个问题。无论如何,在有人向我展示llNodes 的分配点之前,我无法正确解决内存泄漏问题。
  • 你是对的,OP 是关于访问冲突的,但是说删除列表的正确方法是删除根节点是不正确的,并且会导致不良做法和未来问题在路上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多