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

时间:2015-05-01 15:27:42

标签: c++ pointers linked-list

我已经开始学习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;
}

我似乎无法理解它为什么不起作用。我想到的一个原因是 ListItem a 在每次迭代中都没有重置,但这对我没有任何意义。任何帮助或想法都表示赞赏。

1 个答案:

答案 0 :(得分:1)

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

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