Необработанная ошибка исключения с функцией Stack Pop ()

Я работаю над домашним заданием, включающим связанные списки, и у меня возникли проблемы с функцией Pop (). Вот мой код:

void CardStack::Pop( )
{
if ( m_top->m_next == NULL )
{
delete m_top;
m_top = NULL;
}

else
{
Node* ptrNode = m_top;

// gets 2nd to last node
while ( ptrNode->m_next != m_top )
{
ptrNode = ptrNode->m_next;
}
// delete last node, then set second to last to null
delete m_top;
m_top = NULL;

ptrNode->m_next = NULL;
m_top = ptrNode;
}
m_size--;
}

Я продолжаю получать эту ошибку времени выполнения, когда я запускаю программу, ломая оператор if:

Необработанное исключение в 0x008e2009 в назначении 7 — CS201.exe: 0xC0000005:
Место чтения нарушения доступа 0x00000004.

Мой друг рекомендовал удалить m_top = NULL из программы, которая заставляет оператор if работать. Я бы предпочел сохранить нулевое значение без изменений, но это заставило программу двигаться. В любом случае, он прерывает цикл while с этой ошибкой:

Необработанное исключение в 0x00b91f4a в назначении 7 — CS201.exe: 0xC0000005:
Нарушение прав доступа на месте чтения 0xfeeefeee.

Я проверил это с помощью оператора cout, и ошибка исходит из тела цикла while; ptrNode = ptrNode->m_next, Я не совсем уверен, как обойти это. Любой совет будет принята с благодарностью.

Кроме того, вот большая часть моей программы, если она помогает:

Заголовок:

class Node
{
public:
friend class CardStack;

private:
Node* m_next;
int m_data;
};

class CardStack
{
public:
CardStack();
~CardStack();

void Push( int value );
void Pop();
int Top();
int GetSize();

private:
int m_size;
Node* m_top;
};

Конструктор, деструктор, Push ():

#include <iostream>
#include "CardStack.h"using namespace std;

CardStack::CardStack( )
{
m_top = NULL;
m_size = 0;
}

CardStack::~CardStack( )
{
while ( m_top != NULL )
{
Pop( );
}
}

void CardStack::Push( int value )
{
//creates new node
Node* newNode = new Node;
newNode->m_data = value;
newNode->m_next = NULL;

// tests if the list is empty
if ( m_top == NULL )
{
m_top = newNode;
}
// if the list does contain data members and a last node exists
else
{
m_top->m_next = newNode;
m_top = newNode;
}
m_size++;
}

Главный:

#include <iostream>
#include <string>
#include <fstream>
#include "CardStack.h"using namespace std;

void loadDeck ( ifstream&, CardStack& );
void playGame ( CardStack& );

void loadDeck ( ifstream& inFile, CardStack *card )
{
int currentCard;

while( !inFile.eof() )
{
inFile >> currentCard;
card->Push( currentCard );
}
}

void playGame( CardStack *card )
{
int score[ 4 ];
int player;
while( card->GetSize() != 0 )
{
player = card->GetSize() % 4;
score[ player ] += card->Top();
card->Pop();
}

for ( player = 0; player < 4; player++ )
cout << "Player " << player << "'s score is " << score[ player ] << endl;
}

int main()
{
CardStack *card = new CardStack;
string fileName;
ifstream inFile;

do
{
cout << "Input the name of the card file (not including extension): ";
cin >> fileName;

fileName += ".txt";

inFile.open( fileName );

if ( !inFile.is_open() )
cout << "File could not be opened. Reenter the file name." << endl;
}
while( !inFile.is_open() );

loadDeck( inFile, card );
playGame( card );

inFile.close();

system( "pause" );
return 0;
}

0

Решение

Это круговой связанный список?
если нет, то почему вы тестируете в цикле:

while ( ptrNode->m_next != m_top )

и нет:

while ( ptrNode->m_next != NULL )

Если это так, почему вы устанавливаете:

ptrNode->m_next = NULL;

а не до «оригинала» m_top-> next ??

0

Другие решения

Вы должны убедиться, что только первый раз в цикле

while ( ptrNode->m_next != m_top )
{
ptrNode = ptrNode->m_next;
}

ptrNode не будет NULL,
потому что вы должны проверить это в блоке if,
но когда второй раз в цикле, ptrNode может быть NULL, потому что теперь это на самом деле

m_top->m_next->m_next

Но как вы можете убедиться, что m_top-> m_next не равен NULL, когда он равен NULL, произойдет сбой

Может быть, вы должны изменить его на

while ( ptrNode->m_next != NULL )
{
ptrNode = ptrNode->m_next;
}

Дополнительно, есть еще одна проблема, в вас нажать функцию

else
{
m_top->m_next = newNode;
m_top = newNode;
}

должно быть

else
{
newNode->m_next = m_top;
m_top = newNode;
}
0

По вопросам рекламы [email protected]