我使用这个函数来擦除具有特定值的元素:
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++程序员,所以这可能不习惯-把它作为一个一般的想法):
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;
}