2016-03-04 99 views
-1

我试图编写一些代码从圆形双向链表中删除一个节点。我已经写了下面的函数,它主要作品:删除一个圆形双向链表中的节点

bool Circular::remove(int index) 
{ 
    if (head == NULL) 
     return false; 
    Node* current; 
    current = head; 
    if (index > 0) 
    { 
     for (int i = 0; i < index; i++) 
     { 
      current = current->next; 
     } 
    } 
    else if (index < 0) 
    { 
     for (int i = 0; i < abs(index); i++) 
     { 
      current = current->prev; 
     } 
    } 
    if (current == head) 
    { 
     head = current->next; 
    } 
    else if (current == tail) 
    { 
     tail = current->prev; 
    } 
    current->prev->next = current->next; 
    current->next->prev = current->prev; 
    return true; 
} 

我唯一的问题是,当我通过数字1到索引数量也不会删除正确的值。相反,它总是删除尾部。如果你认为我的代码在其他地方有问题,那么我也会研究它。

+2

通过链接列表工作的好方法是笔和纸。绘制节点。绘制所有的链接。一个接一个,并且一次只有一个地方没有链接点,请将链接更改为所需的配置。编码你必须采取的步骤。还花一些时间学习使用系统的调试器。当您可以一行一行地观看程序时,加快解决问题的时间。 – user4581301

+0

你能给出一个显示错误的完整测试用例吗? – mindriot

+1

另外,你的'remove'方法泄漏内存;它会丢弃指针但不会删除该节点。 – mindriot

回答

0

我想我已经知道了。主要是我使用的功能去除头...

Node* temp = head; 
head = head->next; 
head->prev = tail; 
tail->next = head; 
delete temp; 
return true; 

...并去除尾:

Node* temp = tail; 
tail = tail->prev; 
tail->next = head; 
head->prev = tail; 
delete temp; 
return true; 

显然就在头移动和尾巴是不够的,实际删除那些节点。