【问题标题】:Deleting a node in a linked list left some data删除链表中的节点会留下一些数据
【发布时间】:2014-07-23 05:11:40
【问题描述】:

我已经使用这个函数来擦除具有特定值的元素:

    void eraseFromTable(ipTable * head,int sock)
{
    while(head) 
    {
        if(head->sockNumber == sock)
        {
            delete head;
            break;
        }

        head = head->next;
    }
}

这是结构:

    struct ipTable
{
    char iPv4[INET_ADDRSTRLEN];

    char iPv6[INET6_ADDRSTRLEN];

    int sockNumber;

    int ipv4;

    int ipv6;

    ipTable * next;
};

问题是当我使用擦除功能然后再次显示所有列表时 在已删除的节点的位置仍然显示 sockNumber。 我也尝试过 free() 函数,但它是一样的。 我怎样才能擦除所有内容,实际上断开该特定节点?

【问题讨论】:

  • 这个函数不会破坏链表吗?删除时您没有将前一个节点与下一个节点链接...

标签: c++ linked-list


【解决方案1】:

你没有做两件事:

  1. 修复从前一个节点到要删除的节点的断开链接。
  2. 重新分配头指针(必须通过引用/通过双指针等传递),以防要删除的节点是列表的头。

这是一个修复(未经测试;另请注意,我并不是真正的 C++ 程序员,因此这可能不是惯用的 - 将其视为一般想法):

bool eraseFromTable(ipTable** headPtrPtr, int sock)
{
    ipTable* headPtr = *headPtrPtr;

    if(headPtr && headPtr->sockNumber == sock)
    {
         *headPtrPtr = headPtr->next;
          delete headPtr;

           // I'm assuming there can only be 1 matching entry; 
           // will need change otherwise. 
          return true;
    } 

    ipTable* nodePtr = headPtr;      

    while(nodePtr)
    {
         ipTable* nextPtr = nodePtr->next;
         if(nextPtr && nextPtr->sockNumber == sock)
         {
              nodePtr->next = nextPtr->next;
              delete nextPtr;

              // I'm assuming there can only be 1 matching entry;
              // will need change otherwise. 
              return true;
         }      

         nodePtr = nextPtr;    
    } 

    return false;  
}

【讨论】:

  • 啊!谢谢。基本上我必须连接已擦除节点的前一个和下一个。
  • @Azazel +1 回答。 Ani,如果你想加入 C++ 的抛出,你可以通过引用 (ipTable *& headPtr) 传递头指针。无论如何,这个想法是正确的(尽管我更喜欢使用双重间接的链表管理,因为它可以将大多数算法缩短约 50%,包括这个)。
猜你喜欢
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多