无法在 C++ 中的循环中将项目添加到链表

Can't add items to linked list in a loop in C++

本文关键字:项目 添加 链表 C++ 循环      更新时间:2023-10-16

我已经开始学习C++,作为第一个项目,我正在尝试制作一个链表应用程序。到目前为止,我对链表概念没有任何真正的问题,因为我以前用不同的语言使用它。

到目前为止,我已经具有将项目添加到列表并打印它的工作功能。在 main() 类中,我可以一个接一个地添加项目,但是当我尝试通过 for 或 while 循环添加多个项目时。

我有单独的函数来创建项目并将其添加到列表(开头):

ListItem createItem(int value)
{
    ListItem x;
    std::cout << &x;
    x.value = value;
    return x;
}
void addBeg(ListItem* &start, ListItem &item)
{
    // Adding to an empty list
    if (start == nullptr)
    {
        item.prev = &item;
        item.next = &item;
    }
    else
    {
        std::cout << std::endl <<"X" &item;
        item.prev = (*start).prev;
        (*item.prev).next = &item;
        item.next = start;
        (*start).prev = &item;
    }
    start = &item;
}

我的 main() 函数看起来像这样:

int main(void)
{
    using namespace std;
    // List is empty at the beginning.
    ListItem* start = nullptr;
    printList(start);
    // This doesn't work:
    int i = 0;
    while (i < 10)
    {
        ListItem a = createItem(i);
        addBeg(start, a);
        i++;
    }
    // This works:
    addBeg(start, createItem(12));
    addBeg(start, createItem(13));
    addBeg(start, createItem(-42));
    addBeg(start, createItem(1));
    addBeg(start, createItem(-85));
    printList(start);
    return 0;
}

我似乎无法理解为什么它不起作用。我想到的一个原因是列表项 a 不会在每次迭代中重置,但这对我来说没有任何意义。任何帮助或想法不胜感激。

createItem函数按返回,并将其直接传递给另一个函数时(就像你所做的那样,例如 addBeg(start, createItem(12))返回的值是临时的。获取并保存临时值的地址将导致未定义的行为

简单的解决方案是让createItem使用 new 动态创建一个堆节点,并返回一个指针。