所以我有一个C ++类的项目,我们被要求使用Stacks和Doubly Linked Lists创建一个库程序。现在我们不能使用堆栈头文件,所以从推送,弹出,显示等所有东西都必须由我们创建。
我的推送功能正常工作,但显示功能我似乎无法让它显示的不仅仅是lastNode stuct。当它尝试访问previousNode时,它崩溃了。关于我做错什么的任何想法?
此外,我也无法使用pop功能。该程序在运行时也会崩溃。
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;
};
答案 0 :(得分:0)
由于您没有显示BookNode
类定义或其构造函数,我只能假设您忘记清除节点previousNode
指针,这意味着在您添加第二秒后节点然后bkStack->lastNode->previousNode
将是一个未初始化的指针。
取消引用未初始化的指针会导致undefined behavior。
答案 1 :(得分:0)
我暂时没有完成c ++,所以如果下面的任何声明都错了,请告诉我!
我在这看到:
在displayStackElements
:
nodePtr = bkStack->lastNode->previousNode;
应为nodePtr = nodePtr->previousNode;
否则,您将始终在无限循环中显示bkStack的lastnode的previousnode!
我不知道为什么你到处都这样做:
BookNode *nodePtr = new BookNode;
nodePtr = bkStack->lastNode;
如果您正在分配新的BookNode,那么您不需要新的BookNode!您正在内存中创建一个新的BookNode,然后覆盖指针。这是内存泄漏。你可以这样做:
BookNode *nodePtr = bkStack->lastNode;
在你的pop函数中,最后一个其他代码应该是这个。您希望弹出lastnode,而不是当前最后一个节点的上一个节点。
temp = bkStack->lastNode->previousNode;
BookNode *lastNode = bkStack->lastNode
bkStack->lastNode->previousNode = NULL;
bkStack->lastNode = temp;
return lastNode;
在push函数中,您正在设置last节点的最后一个节点,但在此之后,您使用参数传入的节点覆盖了lastNode。您的列表已损坏,因为lastNode-&gt; previousNode将始终为emtpy。 else语句应该是这个。
bkNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;