从链接列表中删除节点

时间:2014-06-19 11:46:40

标签: c++ linked-list nodes

正在努力更好地理解链表行为。我觉得这种逻辑是正确的,但我只是没有得到正在发生的事情。当我点击我的主要点时,程序正在破坏,我将从列表中删除一个节点。现在它破了," exe"我的Release文件夹(VS2013)中的文件现在丢失了,我无法运行程序进行调试。 IDK在那里发生了什么,我不知道为什么这不起作用。任何帮助都会很棒!

当我运行它时,它会挂起list1.remove(NODE_TO_REMOVE),现在我的调试器无法运行该程序。

LinkedList.h:

class LinkedList
{
protected:
    struct ListNode
    {
        double value;
        ListNode *next;
        ListNode(double value1, ListNode *next1 = NULL)
        {
            value = value1;
            next = next1;
        }
    };
    ListNode *head;
public:
    // Class Constructor(s)
    LinkedList() { head = NULL; }
    LinkedList(const LinkedList &);

    void add(double x);
    void print() const;
    void LinkedList::remove(double value);
private:
};

LinkedList.cpp:

// Copy Constructor
LinkedList::LinkedList(const LinkedList &object)
{
    head = object.head;
}

void LinkedList::add(double x)
{
    if (head == NULL)
        head = new ListNode(x);
    else
    {
        ListNode *nodePtr = head;
        while (nodePtr->next != NULL)
            nodePtr = nodePtr->next;
        nodePtr->next = new ListNode(x);
    }
}

void LinkedList::print() const
{
    ListNode *nodePtr = head;
    while (nodePtr)
    {
        std::cout << nodePtr->value << ", ";
        nodePtr = nodePtr->next;
    }
}

void LinkedList::remove(double value)
{
    ListNode *nodePtr = head;
    ListNode *ptrDel = NULL;
    ptrDel = nodePtr;
    while (ptrDel != NULL)
    {
        if (nodePtr->value == value)
        {
            ptrDel = nodePtr;
            nodePtr = ptrDel->next;
            delete ptrDel;
            break;
        }
    }
}

主:

int main()
{
    const double NODE_TO_REMOVE = 15.23;
    const double LIST1_NODES[] = { 67.5, -7.8, NODE_TO_REMOVE, 98.76, -19.45 };
    const double NONEXISTENT_NODE = 45.76;
    const int SIZE = sizeof(LIST1_NODES) / sizeof(LIST1_NODES[0]);

    LinkedList list1;
    LinkedList list3;
    LinkedList list4;

    for (int index = 0; index < SIZE; ++index)
        list1.add(LIST1_NODES[index]);

    cout << "  \"list1\" original: ";
    list1.print();

    //copy constructor test
    LinkedList list2(list1);

    cout << "    \"list2\" original: ";
    list2.print();

    // node removal test:
    list1.remove(NODE_TO_REMOVE);
    cout << "\n      \"list1\" modified:  ";
    list1.print();
    cout << "\n      \"list2\" unchanged: ";
    list2.print();

    cout << endl; 
    system("pause");

    return 0;

1 个答案:

答案 0 :(得分:1)

一般来说,如果要删除链接列表中的节点,首先要查找它。假设您要删除该节点中的data算法为:

  1. 指向head
  2. 循环,直到找到包含data
  3. 的节点
  4. 将上一个节点的next指向持有data的{​​{1}}
  5. 的节点
  6. 现在删除包含next
  7. 的节点

    注意:当数据位于data本身时,您会遇到一种特殊情况。

    C ++ 中,这可以在下面的代码中完成:

    head