2014-11-18 1 views
0

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

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

Также я не могу заставить функцию 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

Пожалуйста, создайте [Minimal, полный и проверяемых пример] (http://stackoverflow.com/help/mcve) –

+0

'bkStack-> lastNode-> previousNode' всегда то же самое. Вы имеете в виду 'nodePtr-> previousNode'? – molbdnilo

+0

Вы говорите в функции popBook? если так, то я думаю. Я действительно не знаю.Учитель не очень хорошо объяснил эту тему, и я посмотрел видео и прочитал об этом. Как будто я немного разбираюсь в том, как это делается, но реализация этой идеологии по-прежнему вызывает беспокойство. –

ответ

0

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

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

В displayStackElements:

nodePtr = bkStack->lastNode->previousNode; должны быть nodePtr = nodePtr->previousNode; иначе, вы всегда будете отображать previousnode из LastNode из 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; 

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

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

Программа по-прежнему закрывается на мне. –

+0

@ SamuelO'Neal Проверьте мои последние изменения – Nico

+0

Большое вам спасибо, что исправил это! Теперь это имеет смысл. –

0

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

Выделение неинициализированных указателей ведет к undefined behavior.

 Смежные вопросы

  • Нет связанных вопросов^_^