我已经开始学习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 在每次迭代中都没有重置,但这对我没有任何意义。任何帮助或想法都表示赞赏。
答案 0 :(得分:1)
createItem
函数按值返回 ,当将其直接传递给另一个函数时(就像使用例如addBeg(start, createItem(12))
一样,返回的值为 临时 。获取并保存临时值的地址将导致未定义的行为。
简单的解决方案是让createItem
使用new
创建堆的节点动态,并返回一个指针。