C++ C++;链表删除节点

C++ C++;链表删除节点,c++,singly-linked-list,C++,Singly Linked List,我试图遍历一个单链表并删除包含某个字符的所有节点。我一直试图通过在线查找并尝试这些建议来修复指针错误(它说glibc检测到:双重免费或损坏),但现在我似乎在重写原始代码后陷入了循环。我想我至少陷入了第三个while循环,我尝试过使用and if/else语句,但同样的事情发生了。我有时也会出现分割错误 代码: 事先谢谢你的帮助。难怪你会有这样的麻烦。您只需要一个for循环。请允许我简化您的代码[请原谅一些不必要的风格编辑]。注意:这是未经测试的,可能并不完美: int MonsterList::

我试图遍历一个单链表并删除包含某个字符的所有节点。我一直试图通过在线查找并尝试这些建议来修复指针错误(它说glibc检测到:双重免费或损坏),但现在我似乎在重写原始代码后陷入了循环。我想我至少陷入了第三个while循环,我尝试过使用and if/else语句,但同样的事情发生了。我有时也会出现分割错误

代码:


事先谢谢你的帮助。

难怪你会有这样的麻烦。您只需要一个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中。如果您可以编辑您的问题并发布更多代码,我可以进一步提供帮助。