ich eine doppelt verkettete Liste zu schaffen, und ich bekam einen seltsamen Fehler, verbrachten Stunden, um es zu debuggen, aber nicht so tun konnte, versucht, einen Online-Debugger und auch die nichtdoppelt verknüpften Liste „nicht behandelte Ausnahme“ Fehler
halfendas Programm nicht kompiliert und ausgeführt, aber stürzt der Fehler, den ich bekommen ist
Unbehandelte Ausnahme bei 0x770215ee in doppelt verkettete list.exe: 0xC0000005: Zugriffsverletzung Schreibort 0x00000004.
Online-Debugger führt http://onlinegdb.com/Bkta6O6ig
Der Online-Debugger gibt drei Fehler, die ich in dem unten stehenden Code erwähnt habe mit Kommentaren
Meine Vermutung ist, dass es etwas falsch in der Add-Funktion der Klassenliste ist
Klasse Node
#include <iostream>
using namespace std;
class node
{
private:
int data;
node *prev_pointer;
node *next_pointer;
public:
int get_data()
{
return data;
}
void set_data(int data)
{
this->data = data;
}
node* get_prev_ptr()
{
return prev_pointer;
}
void set_next_ptr(node *Node)
{
next_pointer = Node;
}
node* get_next_ptr()
{
return next_pointer;
}
void set_prev_ptr(node *hi)
{
prev_pointer = hi; //First error
}
};
Klassenliste
class List
{
private:
int size;
node * cursor;
node * lastnode;
node * headnode;
public:
List();
void add(int data);
bool next();
void previous();
void start();
void traverse();
int get_data();
// ~List();
};
List :: List()
{
headnode = new node();
cursor = NULL;
lastnode = NULL;
size = 0;
}
void List:: add(int data)
{
node *newnode = new node();
newnode->set_data(data);
if (cursor != NULL)
{
newnode->set_next_ptr(cursor->get_next_ptr());
newnode->set_prev_ptr(cursor);
(newnode->get_next_ptr())->set_prev_ptr(newnode); //2nd error
cursor->set_next_ptr(newnode);
lastnode = cursor;
cursor = cursor->get_next_ptr();
}
else
{
newnode->set_next_ptr(NULL);
newnode->set_prev_ptr(headnode);
headnode->set_next_ptr(newnode);
cursor = newnode;
lastnode = headnode;
}
size++;
}
bool List :: next()
{
if (cursor != NULL)
{
return false;
}
else
{
lastnode = cursor;
cursor = cursor->get_next_ptr();
}
if(cursor == NULL || size == 0)
return false;
else
return true;
}
void List :: traverse()
{
node *temp = cursor;
start();
for (int i = 0 ; next() ; i++)
{
cout<<"element " << i << " " << cursor->get_data() <<endl;
}
}
void List :: start()
{
lastnode = headnode;
cursor = headnode;
}
int List :: get_data()
{
return cursor->get_data();
}
Haupt
int main()
{
List list;
list.add(10);
list.add(11); //3rd error
list.add(12);
//list.add(13);
//list.add(14);
//list.add(15);
list.traverse();
return 0;
}
Der Debugger wird Ihnen nur helfen, Probleme zu finden. Es wird keine Probleme für Sie finden. 'add' überprüft nicht, dass' newnode' einen Nicht-NULL-Zeiger erhalten hat, bevor er versucht hat, es zu verwenden. Es überprüft, dass 'cursor' nicht NULL ist, aber nicht, dass 'cursor's next nicht NULL ist. – user4581301