Не может отображать стеки или Push

0

Поэтому у меня есть проект для моего класса C++, и нас просят создать библиотечную программу, используя Stacks и Doubly Linked Lists. Теперь мы не можем использовать файл заголовка стека, чтобы все, что было создано от push, pop, display и т.д.

У меня есть функция push, но функция отображения я не могу заставить ее отображать больше, чем только элемент lastNode. Когда он пытается получить доступ к предыдущемуNode, он сбой. Любые идеи о том, что я делаю неправильно?

Также я не могу заставить поп-функцию работать. Программа также срабатывает, когда она запускается.

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 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;
  }
}

(edit) Извините, что здесь структуры из основного файла заголовка

    struct Book
        {
            int isbn;
            string name;
            string authorName;
            int pagesNumber;
        };

    struct BookNode
        {
            Book bk;
            BookNode *previousNode;
        };

    struct BookStack
        {
            BookNode *lastNode = NULL;
        };
  • 0
    Пожалуйста, создайте минимальный, полный и проверяемый пример
  • 0
    bkStack->lastNode->previousNode - это всегда одно и то же. Вы имеете в виду nodePtr->previousNode ?
Показать ещё 6 комментариев
Теги:
push
stack
pop

2 ответа

0
Лучший ответ

Я еще не сделал c++, поэтому, если какое-либо из приведенных ниже утверждений неверно, скажите мне об этом!

Вот что я вижу:

В displayStackElements:

nodePtr = bkStack->lastNode->previousNode; должен быть nodePtr = nodePtr->previousNode; в противном случае вы всегда будете показывать предыдущий номер последнего номера bkStack в бесконечном цикле!


Я не знаю, зачем вы это делаете повсюду:

BookNode *nodePtr = new BookNode;
nodePtr = bkStack->lastNode;

Вам не нужен новый BookNode, если вы назначаете его сразу после него! Вы создаете новый BookNode в памяти и затем перезаписываете указатель. Это утечка памяти. Вы можете просто сделать это:

BookNode *nodePtr = bkStack->lastNode;

В вашей поп-функции последний код должен быть таким. Вы хотите вывести lastnode, а не предыдущий узел текущего последнего узла.

temp = bkStack->lastNode->previousNode;
BookNode *lastNode = bkStack->lastNode
bkStack->lastNode->previousNode = NULL;
bkStack->lastNode = temp;
return lastNode;

В вашей функции push вы устанавливаете предыдущийNode последнего узла, но после этого вы переписываете lastNode с узлом, переданным в параметре. Ваш список был сломан, потому что lastNode-> previousNode всегда будет emtpy. Утверждение else должно быть таким.

bkNode->previousNode = bkStack->lastNode;
bkStack->lastNode = bkNode;
  • 0
    Программа все еще закрывается на меня.
  • 0
    @ SamuelO'Neal Проверьте мои последние изменения
Показать ещё 1 комментарий
0

Поскольку вы не показываете определение класса BookNode или его конструктор, я могу только предположить, что вы забыли очистить указатели previousNode узлов, что означает, что после добавления второго второго узла тогда bkStack->lastNode->previousNode будет неинициализированный указатель.

Разделение неинициализированных указателей приводит к неопределенному поведению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню