无法显示堆栈或推送 我有一个C++类的项目,我们要求使用栈和双链表创建库程序。现在我们不能使用堆栈头文件,所以从推送、弹出、显示等所有内容都必须由我们创建

无法显示堆栈或推送 我有一个C++类的项目,我们要求使用栈和双链表创建库程序。现在我们不能使用堆栈头文件,所以从推送、弹出、显示等所有内容都必须由我们创建,c++,stack,C++,Stack,我有推送功能,但显示功能,我似乎不能让它显示更多的只是最后的节点结构。当它试图访问previousNode时,会崩溃。你知道我做错了什么吗 我也不能让pop函数工作。程序运行时也会崩溃 void pushBook(BookStack *bkStack, BookNode *bkNode) { if(isEmpty(bkStack)) { bkStack->lastNode = bkNode; bkStack->lastNode-&g

我有推送功能,但显示功能,我似乎不能让它显示更多的只是最后的节点结构。当它试图访问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;
  }
}
由于没有显示BookNode类定义或其构造函数,我只能假设您忘记清除节点previousNode指针,这意味着在添加第二个节点后,bkStack->lastNode->previousNode将是一个未初始化的指针


不初始化指针导致.

我在一段时间内没有做C++,所以如果下面的语句有错误,请告诉我!p> 我看到的是:

在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函数中,最后一个else代码应该是这样的。您希望弹出最后一个节点,而不是当前最后一个节点的前一个节点

temp = bkStack->lastNode->previousNode;
BookNode *lastNode = bkStack->lastNode
bkStack->lastNode->previousNode = NULL;
bkStack->lastNode = temp;
return lastNode;
在push函数中,您正在设置last node的previousNode,但在此之后,您将使用传入的节点参数覆盖lastNode。由于lastNode->previousNode将始终为emtpy,因此列表已断开。else语句应该是这样的

bkNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;

请创建一个bkStack->lastNode->previousNode始终是相同的东西。你是说nodePtr->previousNode吗?你是说在popBook函数中?如果是的话,我想。我真的不知道。老师并没有很好地解释这个问题,我看了一些视频,读了一些关于它的内容。就像我有点不明白这样做是如何工作的,但实施这种思想对我来说仍然很麻烦。@SamuelO'Neal老师并没有很好地解释这个问题。。。对于大量的案例,情况正好相反。你不太明白你的老师在告诉你什么。你能给我们看一下推送功能吗?这个程序对我来说仍然是关闭的。非常感谢你,修复了它!现在对我来说也有意义了。
bkNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;