Поэтому у меня есть проект для моего класса 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;
};
Я еще не сделал 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;
Поскольку вы не показываете определение класса BookNode
или его конструктор, я могу только предположить, что вы забыли очистить указатели previousNode
узлов, что означает, что после добавления второго второго узла тогда bkStack->lastNode->previousNode
будет неинициализированный указатель.
Разделение неинициализированных указателей приводит к неопределенному поведению.
bkStack->lastNode->previousNode
- это всегда одно и то же. Вы имеете в видуnodePtr->previousNode
?