无法显示堆栈或推送
Can not display stacks or Push
所以我有一个C++类的项目,我们被要求使用堆栈和双向链表创建一个库程序。现在我们不能使用堆栈头文件,所以从推送、弹出、显示等所有内容都必须由我们创建。
我有推送功能在工作,但显示功能我似乎无法让它显示的不仅仅是 lastNode 结构。当它尝试访问previousNode时,它会崩溃。对我做错了什么有什么想法吗?
我也无法让弹出功能工作。程序在运行时也会崩溃。
void pushBook(BookStack *bkStack, BookNode *bkNode)
{
if(isEmpty(bkStack))
{
bkStack->lastNode = bkNode;
bkStack->lastNode->previousNode = NULL;
}
else
{
bkStack->lastNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;
}
}
BookNode *popBook(BookStack *bkStack)
{
BookNode *temp = new BookNode;
if(isEmpty(bkStack))
{
temp = bkStack->lastNode;
return temp;
}
else if(bkStack->lastNode->previousNode == NULL)
{
temp = bkStack->lastNode;
bkStack->lastNode = NULL;
return temp;
}else
{
temp = bkStack->lastNode->previousNode;
bkStack->lastNode->previousNode = NULL;
bkStack->lastNode = temp;
return temp;
}
}
void displayStackElements(BookStack *bkStack)
{
BookNode *nodePtr = new BookNode;
nodePtr = bkStack->lastNode;
if(isEmpty(bkStack))
{
cout << "Book stack is empty." << endl;
}
else
{
while(nodePtr != NULL)
{
cout << "nBook Name: " << nodePtr->bk.name << endl;
cout << "Author Name: " << nodePtr->bk.authorName << endl;
cout << "Page Numbers: " << nodePtr->bk.pagesNumber << endl;
cout << "ISBN: " << nodePtr->bk.isbn << endl;
cout << endl;
nodePtr = bkStack->lastNode->previousNode;
}
}
}
bool isEmpty(BookStack *bkStack)
{
bool status;
if(bkStack->lastNode == NULL)
status = true;
else
status = false;
return status;
}
void addBook(BookStack *bkStack)
{
BookNode *bkNode = new BookNode;
cout << "nEnter the book name: ";
getline(cin, bkNode->bk.name);
cout << "Enter the Author's Name: ";
getline(cin, bkNode->bk.authorName);
cout << "Enter the ISBN: ";
cin >> bkNode->bk.isbn;
cout << "Enter the page numbers: ";
cin >> bkNode->bk.pagesNumber;
pushBook(bkStack, bkNode);
}
void removeBook(BookStack *bkStack)
{
BookNode *removedNode = new BookNode;
removedNode = popBook(bkStack);
if(removedNode == NULL)
{
cout << "nNo books to remove." << endl;
}else
{
cout << endl << removedNode->bk.name << " was removed." << endl;
}
}
(编辑)很抱歉,这是主头文件中的结构
struct Book
{
int isbn;
string name;
string authorName;
int pagesNumber;
};
struct BookNode
{
Book bk;
BookNode *previousNode;
};
struct BookStack
{
BookNode *lastNode = NULL;
};
一段时间没有做过 c++了,所以如果下面的任何陈述是错误的,请告诉我!
在这里我看到的:
在displayStackElements
:
nodePtr = bkStack->lastNode->previousNode;
应该nodePtr = nodePtr->previousNode;
否则,您将始终在无限循环中显示 bkStack 的最后一个节点的上一个节点!
我不知道你为什么到处都这样做:
BookNode *nodePtr = new BookNode;
nodePtr = bkStack->lastNode;
你不需要一个新的 BookNode,如果你在它之后立即分配它!您正在内存中创建一个新的 BookNode,然后覆盖指针。这是内存泄漏。您可以简单地执行此操作:
BookNode *nodePtr = bkStack->lastNode;
在你的 pop 函数中,最后一个 else 代码应该是这个。您希望弹出最后一个节点,而不是当前最后一个节点的上一个节点。
temp = bkStack->lastNode->previousNode;
BookNode *lastNode = bkStack->lastNode
bkStack->lastNode->previousNode = NULL;
bkStack->lastNode = temp;
return lastNode;
在推送函数中,您正在设置最后一个节点的 previousNode,但在那之后,您使用传入参数的节点覆盖了 lastNode。你的列表被打破了,因为lastNode->previousNode将永远是emtpy。else 语句应该是这样的。
bkNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;
由于您没有显示BookNode
类定义或其构造函数,我只能假设您忘记清除previousNode
指针中的节点,这意味着在添加第二个第二个节点后,bkStack->lastNode->previousNode
将是一个未初始化的指针。
取消引用未初始化的指针会导致未定义的行为。
- 提升堆栈跟踪不显示函数名称和行号
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 调用堆栈显示 SIGBUS,这意味着什么
- 如何正确显示此堆栈的内容?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 如何在 c++ 中显示(或循环)堆栈
- 哪些更好的方法可以显示使用C STL创建的堆栈而不弹出每个元素的方法
- 堆栈在函数中弹出仍然显示在主函数中。调用不应该通过引用给定的向量吗
- GDB 显示奇怪的堆栈跟踪
- 我如何修改我的C 程序以显示用户输入的单词,并使用堆栈向后
- 模板堆栈类:堆栈中没有显示数据
- 本地变量的地址不在smaps显示的堆栈地址范围内
- 在C++中显示堆栈元素时的无限循环
- Visual Studio 2008 在堆栈溢出后显示完整的堆栈跟踪
- 可视化泄漏检测器(VLD)显示空的调用堆栈
- 堆芯转储的原因是什么?来自oraclelib的堆栈显示
- gdb回溯没有显示main()的完整堆栈跟踪
- 无法显示堆栈或推送
- 如何显示动态堆栈和队列(c++)中的所有元素