双链表C ++删除元素

时间:2015-12-08 21:06:51

标签: c++

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

这是我的代码:

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;
    }

}

现在删除中间元素已被破坏。

请帮忙

2 个答案:

答案 0 :(得分:1)

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

其次,你看起来有一个无限循环。当你点击你的while循环时你永远不会改变elem所以elem-> gt; next-> next永远不会改变。

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

编辑:

你无法改变这样的元素。把elem想象成你传入的整数或浮点数。如果你想让elem保持头部变化,你将不得不传入指向elem的指针,这最终成为指针的指针。

答案 1 :(得分:0)

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

为了修改第一个元素,您必须在修改此指针时传递对第一个指针的引用。使用方法:

void Delete_element(point del, node *& elem)

从中间删除元素似乎被打破了。 而不是:

elem->prev=temp->prev

你应该:

elem->next->prev=element