链表:删除带有选定数据的节点
Linked List: Deleting nodes with chosen data
我有问题,从我的列表中删除选定的节点。任务是删除包含用户选择的数据的所有节点并对其进行计数。例如,删除所有包含3的节点并计数。函数应返回带有删除节点数量的整数。我的代码函数弹出节点和弹出所有节点,包括特定的数据在这里。我用的是Visual Studio 2012,调试显示有些指针指向了空间。读取内存失败。有什么问题吗?
void pop(Node * head, Node * pointer) //delete node with given pointer
{
Node * p = head;
if (pointer == head)
{
head = p->next;
delete p;
}
else
{
while( p->next != pointer )
{
p = p->next;
}
p->next = pointer->next;
delete pointer;
}
}
int pop_all(Node * head, float data_out) //delete all nodes with proper data
{
Node * p = head;
int counter = 0;
while(p->next != NULL)
{
if (p->data == data_out)
{
pop(head,p);
counter++;
}
else
{
p = p->next;
}
}
return counter;
}
首先有一个问题:为什么是home brew list而不是std::list。
然后建设性的批评:pop函数有错误的签名。如果删除的节点是列表的第一个,则没有办法让函数告诉调用者头部发生了变化。通常我是这样实现的:void pop(Node **head, Node *pointer)
{
for ( ; *head ; head = &((*head)->>next)
if (*head == pointer)
{
Node *temp = *head ;
*head = temp->next ;
delete p ;
}
}
在pop_all()
中,调用pop(head,p)
后,其中head != p
, p
指向内存,您只是delete
d。然后在while
循环的顶部,您要求p->next
,这是未定义的。
相关文章:
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何在Visual C+++中从JSON文件中读取节点数据
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 如何在C++中实现节点数任意的通用树数据结构?
- 如何在C++中使用带有SFML的http reqest从节点.js服务器获取数据?
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++ Eclipse:二叉搜索树节点>数据=变量似乎不起作用
- C++ 在节点内存储对数据对象的引用,而不复制数据
- 如何通过其持有的数据从链表中删除某个节点?
- 基于给定字符串数据类型的链表删除节点
- 为什么我的节点临时节点不能显示正确的数据?
- C++中的数据结构,插入链表中节点的开头
- 交换树数据结构中根的 2 个子节点指针
- 从链表数组访问节点数据
- 如何在NS3中设置节点的IP地址和数据?
- 如何使用模板在数据结构中链接节点对象
- 为数据缺少默认构造函数的链表创建节点
- 递归地将 1 添加到 BST 中的所有节点,但具有最小数据的节点除外
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素