删除链表中的节点留下了一些数据



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

    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()函数,但它是一样的。我怎么能擦除所有东西,实际上连接那个特定的节点?

你没有做两件事:

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

相关内容

  • 没有找到相关文章

最新更新