如何解决从双向链接列表中删除所有出现相同给定字符串的节点
Am试图删除所有出现的给定字符串。此代码删除了一个节点,但其他所有节点都保留了。我试图将其包装在while循环中,但仍然没有效果。
我也想知道,是否有可能删除struct参数并仍然实现它。我试图删除它并修改了代码,但出现了分段错误。谢谢您提前回答。
void deleteNode(struct node** head,char* searchName) {
struct node* current;
for(current=*head; current; current = current->next){
if (!strcmp(current->name,searchName))
{
if (current->next)
current->next->prev = current->next;
if (current->prev)
current->prev->next = current->prev;
if (current == *head)
*head = current->next;
current->prev = NULL;
current->next = NULL;
free(current);
return;
}
}
}
解决方法
return
语句将在第一次命中后结束该函数。同样,序列current->next = NULL; free(current); current = current->next
将在释放后访问内存,并将current设置为NULL。您可能需要在循环内更新current
,并使用一个额外的节点指针变量进行删除。
void deleteNode(struct node** head,char* searchName)
{
struct node* current;
struct node* to_delete;
for(current=*head; current;)
{
if (!strcmp(current->name,searchName))
{
to_delete = current;
current = current->next;
if (current) {
current->prev = to_delete->prev;
}
if (to_delete->prev) {
to_delete->prev->next = current;
}
if (to_delete == *head)
*head = current;
free(to_delete);
} else {
current = current->next;
}
}
}
,
您的功能有误。例如,这个if语句
if (current->next)
current->next->prev = current->next;
应被重写为
if (current->next)
current->next->prev = current->prev;
^^^^
可以通过以下方式声明和定义函数
void deleteNode( struct node **head,const char *searchName )
{
while ( *head )
{
if ( strcmp( ( *head )->name,searchName ) == 0 )
{
struct node *current = *head;
if ( current->next ) current->next->prev = current->prev;
*head = current->next;
free( current );
}
else
{
head = &( *head )->next;
}
}
}
请注意在调用指针{{1}的函数name
之前,如果结构struct node
的数据成员free
指向动态分配的存储字符串的内存,请注意在以上函数中,您必须释放为字符串分配的内存。那就是您需要再添加一个对函数current
的调用,例如
free
如果您有一个指向例如free( current->name );
free( current );
的头节点的全局指针,则可以通过以下方式定义该函数
head
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。