无法在 C++ 中的循环中将项目添加到链表
Can't add items to linked list in a loop in C++
我已经开始学习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
动态创建一个堆节点,并返回一个指针。
相关文章:
- 将项目添加到队列时运行线程
- 如何使用矢量元素将项目添加到结构中?
- 本机 Nuget 包安装在 VS 中,但没有为C++(本机)项目添加引用
- 如何将多个 QStringList 中的项目添加到一个
- CMake 和/或在为项目添加提升时出错
- 我无法将项目添加到 ( 标准::矢量 < 标准::矢量 <标准::字符串> > )
- 计数器将项目添加到数组中,并剩余
- 将CMAKE项目添加到Visual Studio解决方案中
- 如何使用QListView项目添加复选框
- C++将项目添加到集合中
- 在MFC中的树(ctreectrl)中的特定树项目添加图标
- 如何将类的项目添加到C 的数组中,而无需给它们命名
- 如何将项目添加到输出文件中
- CMAKE将新项目添加到解决方案中
- 如何将项目添加到QT中的布局中
- 将项目添加到双向链表的背面时遇到问题
- 捕获非默认文件夹上的项目添加事件
- wxWidgets-通过DLL将项目添加到sizer
- 使用.push_back将新创建的项目添加到库存
- 如何将MFC应用程序项目添加到Visual C 2008中的Win32应用程序项目