无法显示堆栈或推送

Can not display stacks or Push

本文关键字:堆栈 显示      更新时间:2023-10-16

所以我有一个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将是一个未初始化的指针。

取消引用未初始化的指针会导致未定义的行为