C++ C++;链表删除节点
我试图遍历一个单链表并删除包含某个字符的所有节点。我一直试图通过在线查找并尝试这些建议来修复指针错误(它说glibc检测到:双重免费或损坏),但现在我似乎在重写原始代码后陷入了循环。我想我至少陷入了第三个while循环,我尝试过使用and if/else语句,但同样的事情发生了。我有时也会出现分割错误 代码:C++ C++;链表删除节点,c++,singly-linked-list,C++,Singly Linked List,我试图遍历一个单链表并删除包含某个字符的所有节点。我一直试图通过在线查找并尝试这些建议来修复指针错误(它说glibc检测到:双重免费或损坏),但现在我似乎在重写原始代码后陷入了循环。我想我至少陷入了第三个while循环,我尝试过使用and if/else语句,但同样的事情发生了。我有时也会出现分割错误 代码: 事先谢谢你的帮助。难怪你会有这样的麻烦。您只需要一个for循环。请允许我简化您的代码[请原谅一些不必要的风格编辑]。注意:这是未经测试的,可能并不完美: int MonsterList::
事先谢谢你的帮助。难怪你会有这样的麻烦。您只需要一个for循环。请允许我简化您的代码[请原谅一些不必要的风格编辑]。注意:这是未经测试的,可能并不完美:
int
MonsterList::removeMonsterType(char monster)
{
if (!isalpha(monster))
return 0;
// first is the ptr in the list this function is called on
if (first == 0)
return 0;
int count = 0;
char key = toupper(monster);
MonsterNode *prev;
MonsterNode *cur;
MonsterNode *next;
prev = NULL;
for (cur = first; cur != NULL; cur = next) {
// grab this _first_ so we have it before cur may be deleted (e.g. if
// cur gets deleted cur->next is immediately invalid, but this will
// remain)
next = cur->next;
if ((cur->id == key) || (cur->id == (key + 32))) {
// link previous item to next item
if (prev != NULL)
prev->next = next;
// replace first item in list
else
first = next;
// delete the node and advance the count
delete cur
count++;
continue;
}
// remember previous item
prev = cur;
}
return count;
}
怪不得你这么麻烦。您只需要一个for循环。请允许我简化您的代码[请原谅一些不必要的风格编辑]。注意:这是未经测试的,可能并不完美:
int
MonsterList::removeMonsterType(char monster)
{
if (!isalpha(monster))
return 0;
// first is the ptr in the list this function is called on
if (first == 0)
return 0;
int count = 0;
char key = toupper(monster);
MonsterNode *prev;
MonsterNode *cur;
MonsterNode *next;
prev = NULL;
for (cur = first; cur != NULL; cur = next) {
// grab this _first_ so we have it before cur may be deleted (e.g. if
// cur gets deleted cur->next is immediately invalid, but this will
// remain)
next = cur->next;
if ((cur->id == key) || (cur->id == (key + 32))) {
// link previous item to next item
if (prev != NULL)
prev->next = next;
// replace first item in list
else
first = next;
// delete the node and advance the count
delete cur
count++;
continue;
}
// remember previous item
prev = cur;
}
return count;
}
这个代码有太多错误。解决方案应该比这简单得多。你应该试着重新开始,看看会发生什么;尽量简单。这段代码有太多错误。解决方案应该比这简单得多。你应该试着重新开始,看看会发生什么;尽量简单。谢谢你的时间!您的代码很有意义,当我测试它时,尽管我仍然得到glidbc检测到的错误。我想这是因为当我打印列表时,有一个“!”正在打印出来。这件事早些时候也发生在我身上。我不确定这是否意味着最后一个指针指向了错误的地方。@puredreams7我必须假设
第一个
是列表头和全局(例如,不是这个
),否则我给出的代码将不起作用。如果glibc说的是“双重自由/腐败”[它们通常一起发生],这与segfault略有不同,尽管两者可能发生在同一类型的bug中。如果您可以编辑您的问题并发布更多代码,我可以进一步帮助您。谢谢您的时间!您的代码很有意义,当我测试它时,尽管我仍然得到glidbc检测到的错误。我想这是因为当我打印列表时,有一个“!”正在打印出来。这件事早些时候也发生在我身上。我不确定这是否意味着最后一个指针指向了错误的地方。@puredreams7我必须假设第一个
是列表头和全局(例如,不是这个
),否则我给出的代码将不起作用。如果glibc说的是“双重自由/腐败”[它们通常一起发生],这与segfault略有不同,尽管两者可能发生在同一类型的bug中。如果您可以编辑您的问题并发布更多代码,我可以进一步提供帮助。