无法显示堆栈或推送

时间:2014-11-18 20:27:58

标签: c++ stack push pop

所以我有一个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;
        };

2 个答案:

答案 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;