2015-12-08 97 views
0

我有删除链表的第一个和最后一个元素的问题。当我试图删除第一个元素时,我的代码什么都不做(当我打印一个列表时,删除的元素仍然存在)。当我试图删除最后一个时,控制台显示核心转储。双向链表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; 
    } 

} 

现在除去中间元素被打破。

请帮忙

+1

哇,没有太多的空测试正在进行。你有没有尝试在调试器中逐句通过你的代码? – paddy

+0

是的,我修正了最后一个元素的问题,但我仍然无法删除第一个元素。 – Movart

回答

0

我相信你至少有两个缺陷:

为了修改的第一个元素,你必须传递给第一个指针引用,你打算修改这个指针。使用:

void Delete_element(point del, node *& elem) 

从中间删除元素似乎被打破。的 代替:

elem->prev=temp->prev 

你应该有:

elem->next->prev=element 
+0

谢谢你的回答。删除现在工作的第一个和最后一个元素,但现在,从中间删除元素被破坏,它也删除了第一个元素。 – Movart

1

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

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

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

编辑:

你不能像这样改变elem。想象elem就像你传入的整数或浮点数。如果你想让elem保持头部变化,你将不得不传递一个指向elem的指针,这个指针最终是一个指向指针的指针。

+0

谢谢你的回答。我已经修复了不定式循环。我还添加了free()函数,并且当我删除第一个元素时,我看到了垃圾。但是我应该怎样做一个指向第二个元素的指针。当我打印一个列表时,我想只看到第二个和第三个元素,当我先删除时。但现在我看到车库,第二和第三。我该怎么办? – Movart