双链表C++删除元素

Doubly linked list C++ Delete element

本文关键字:元素 删除 C++ 链表      更新时间:2023-10-16

我在删除链表的第一个和最后一个元素时遇到问题。当我试图删除第一个元素时,我的代码什么也不做(当我打印列表时,删除的元素仍然存在)。当我试图删除最后一个时,控制台显示核心转储。

这是我的代码:

void Delete_element(point del, node *elem) {
    struct node *temp = elem;
    if(elem->p.x==del.x && elem->p.y == del.y) {   
        elem=elem->next;
        return;
    } else {
        while(elem->next->next!=NULL) {
            if(elem->next->p.x==del.x && elem->next->p.y==del.y) {
                temp=elem->next;
                elem->next=elem->next->next;
                elem->prev=temp->prev;
                return;
            }
            temp=temp->next;
        }
    }
    if(elem->next->p.x==del.x && elem->next->p.y==del.y) {
        elem->next=NULL;
    }
}

编辑:修复后

void Delete_element(point del, node *& elem){
     struct node *temp = elem;
if(elem->p.x==del.x && elem->p.y == del.y){
        temp = elem->next;
        free(elem);
        elem=temp;
    return;
}else{
    while(elem->next->next!=NULL)
    {
        if(elem->next->p.x==del.x && elem->next->p.y==del.y)
        {
            temp=elem->next;
            elem->next=elem->next->next;
            elem->next->prev=elem;
            return;
        }
        elem=elem->next;
    }}
    if(elem->next->p.x==del.x && elem->next->p.y==del.y){
            elem->next=NULL;
            return;
    }
}

现在移除一个中间元素就被破坏了。

请帮助

首先,您实际上并没有删除任何内容。然而,您留下了悬空指针,这会导致内存泄漏。在每种情况下,你都应该删除一些内容。这就是为什么您仍然可以看到数据,而不是垃圾或某种崩溃。

第二,你看起来有一个无限循环。当你打while循环时,你永远不会改变elem,所以elem->next->next永远不会改变。

第三,为什么要删除while循环中的elem->next?删除elem以避免混淆。

编辑:

你不能那样改变elem。把elem想象成一个整数或你传递的浮点值。如果你想让elem保持头部的变化,你就必须传递一个指向elem的指针,它最终成为一个指向指针的指针。

我相信你至少有两个错误:

为了修改第一个元素,您必须在打算修改第一个指针时传递对该指针的引用。用途:

void Delete_element(point del, node *& elem)

从中间移除一个元素似乎已损坏。而不是:

elem->prev=temp->prev

你应该有:

elem->next->prev=element