C++ - Doppelt Verkettete Liste-Programm
Ich habe versucht, mir beibringen, Programmierung für ein paar Monate jetzt, ich habe mir über drei Bücher und sah eine tonne von videos auf YouTube, die war großartig so weit. Aber die Letzte Woche oder so hab ich überfragt Dank verknüpfte Listen! Ich bekomme das ganze Konzept, aber die syntax ist, mich zu töten! Ich habe geschrieben, ein paar sehr einfache verknüpfte Listen-Programme für die übung, aber jetzt bin ich versucht, ein Programm zu schreiben, wo lade ich einige Informationen aus einer Datei (Informationen von Personen, die ein Visum beantragt) auf eine verknüpfte Liste dann nur die Anzeige die ganze Menge wieder(sobald das getan ist, ich plan auf der Erweiterung, wo ich nur die Anzeige bestimmter Knoten und entfernen bestimmter Knoten aber ich werde nicht ins detail gehen). Hoffentlich wird der unten gezeigte code ist nicht zu lang, und wenn ich könnte nur erhalten Sie einige Hinweise (kein Wortspiel beabsichtigt) oder einige Ausschnitte, um mir zu helfen zu verstehen, dieses Zeug, dass wäre genial!
p.s einige der in diesem code ist von einem ähnlichen Beispiel in einem Buch.
hier ist die main(die meisten)mit der Schleife zum laden der Daten(es funktioniert nicht)
List myList;
visa_application *visa;
Node * pNode;
string visa_type;//these are all the variables that i want to load from the file
int invoice_no;
string surname;
string firstname;
double contact;
string status;
string result;
ifstream in;
in.open("applications.txt",ios::in);
while (!in.eof()){
pNode = new Node;
visa = new visa_application; //allocate memory for nodes
in >> visa-> visa_type >> visa->invoice_no >> visa-> surname;
in >> visa-> firstname >> visa-> contact >> visa-> status >> visa-> result ;
pNode->nData = &visa; //put some data in the node
myList.appendNode(pNode); //add node to list
}
Hier ist meine Klasse node-header-Datei
class Node
{
friend class List;
private:
node_data * nData;
Node *pNext;
Node *pPrev;
public:
Node (node_data * data){nData = data;
pNext = NULL;
pPrev = NULL;}
node_data * getData(){return nData;}
};
hier ist Klasse Liste-header-Datei
class List
{
private:
Node *pHead;
Node *pTail;
Node *createNode(node_data * data);
public:
List ();
~List();
Node *getpHead (){ return pHead;}
Node *getpTail (){return pTail;}
Node *previousNode(Node *pNode){return pNode->pPrev;}
Node *nextNode (Node *pNode){return pNode->pNext;}
void appendNode(node_data * value);
void insertNode(node_data * value, Node *pAfter);
void removeNode(Node *pNode);
bool isEmpty();
void printList();
};
List ::List() {
pHead=NULL;
pTail=NULL;
}
List ::~List(){
while (!isEmpty()) //keep on removing until the
//head points to NULL
removeNode(pHead);
cout << "List deleted\n";
}
Node * List::createNode(node_data * data){
Node * pNode = new Node (data); //allocate memory for new node and
//intialize value to data
return pNode;
}
bool List ::isEmpty(){
return pHead == NULL;
}
void List ::appendNode(node_data * value)
{
Node * pNode = createNode(value);
if (isEmpty()) { //if list is empty
pHead = pNode; //make head point to pNode
pNode->pPrev = NULL;
}
else { //otherwise
pTail->pNext = pNode; //make tail point to pNode
pNode->pPrev = pTail;
}
pTail = pNode; //tail is now pNode
pNode->pNext = NULL; //pNode next now points to NULL
}
void List ::insertNode(node_data * value, Node *pAfter)
{
Node *pNode = createNode(value);
pNode->pNext = pAfter->pNext;
pNode->pPrev = pAfter;
if (pAfter->pNext != NULL)
pAfter->pNext->pPrev = pNode;
else
pTail = pNode;
pAfter->pNext = pNode;
}
void List ::removeNode(Node *pNode)
{
if (pNode->pPrev == NULL) //if removing the head
pHead = pNode->pNext;
else
pNode->pPrev->pNext = pNode->pNext; //if removing a middle node
if (pNode->pNext == NULL) //if removing the tail
pTail = pNode->pPrev;
else
pNode->pNext->pPrev = pNode->pPrev;
pNode = NULL;
delete pNode; //*free the memory
}
void List ::printList()
{
Node *pNode=pHead;
if (isEmpty())
cout << "The list is empty\n";
else
for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
pNode->nData->print();
}
Meiner Klasse visa-Anwendung-header-Datei
class visa_application
{
public:
//class constructor
visa_application();
//class destructor
~visa_application();
private:
string visa_type;
int invoice_no;
string surname;
string firstname;
double contact;
string status;
string result;
};
und schließlich das Visum application.cpp
visa_application::visa_application()
{
string visa_type = none;
int invoice_no = 0;
string surname = none;
string firstname = none;
double contact = 00;
string status = none;
string result = none;
}
class destructor
visa_application::~visa_application()
{
//insert your code here
}
Ich bin immer der Fehler "keine passende Funktion für Aufruf von `Liste::appendNode(Knoten*&)'" unter ein paar andere Dinge.Ja, ich weiß, das ist lang, aber es wäre toll, wenn ich könnte einige Hilfe, ich habe keinen Betreuer oder Lehrer oder jemand wie mir zu helfen, so dass jedes feedback würde sehr geschätzt! Danke!
**BEARBEITEN Sie die Fehlermeldungen sind:
no matching function for call to `Node::Node()'
candidates are: Node::Node(const Node&)
Node::Node(node_data*)
no matching function for call to `List::appendNode(Node*&)'
candidates are: void List::appendNode(node_data*)
while (!in.eof()){pNode = new Node;
Ich denke, Sie sind nicht gelöscht pNode
Daten hier ein, damit Ihr Programm ein Speicherleck...Nicht die Lösung, aber seine gut zu kennen. Edit: das gleiche gilt für visa
Wenn Sie das tun
pNode->nData = &visa;
legen Sie die nData
Mitglied Zeiger auf einen Zeiger auf eine visa_application
, dies ist wahrscheinlich nicht das, was Sie wollen.Außerdem poste bitte die komplette und ungeschnittene Fehlermeldung melden. Und darauf hinweisen, wo in der geposteten Quelle die Fehler sind.
pNode = NULL;delete pNode; //*free the memory
Sie sind Abgleich und löschen Sie keine Speicher...Ihr solltet Euch diesen anderen Weise herum. Um ehrlich zu sein, Sie haben Ihr Programm ein Speicherleck, alle über dem Platz. Ich weiß, das ist nicht die Frage, aber ich denke, Sie sollten gehen Sie zurück über poiners und die Verwaltung von dynamisch allozierten Speicher. Zusammengefasst: nichts in den code (im Grunde) gelöscht wird.Und was auf der Erde ist
node_data
? Es gibt keine Erwähnung, dass die Klasse/Struktur/typedef in Ihrem Programm.
InformationsquelleAutor user2710184 | 2013-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich es sehe, deine Liste hat nur die Methode:
aber in deinem main, rufen Sie die methode mit einem Objekt der Klasse Node.
Versuchen
statt:
Auch, wie bereits vorgeschlagen, in den Kommentaren. Schreiben Sie immer die ganze errocode in Ihrer Frage, einschließlich der position. Beste Praxis ist, gehören der compiler und das os auch.
InformationsquelleAutor Martin Schlott
Entsprechend Ihrer eigenen Deklaration der Funktion können Sie nicht aufrufen,
mit einem Zeiger auf
Node
Sie müssen übergeben Sie einen Zeiger vom Typnode_data*
es.Als andere, erwähnt in den Kommentaren, es gibt eine Menge andere Mängel und Fehler in Ihrem code.
InformationsquelleAutor πάντα ῥεῖ
Deklariert und definiert appendNode als nichtig appendNode(node_data * Wert); aber Sie haben versucht, den Aufruf mit myList.appendNode(pNode); //Knoten hinzufügen zur Liste, pNode hier ist ein Objekt der Node-Typ, so hast du deinen Fehler.
InformationsquelleAutor Ross Wang
Vorausgesetzt
node_data*
ist eine Art von typedef vonvoid*
in anderen Worten void-Zeiger, übergeben SieNode
wie Sie Ihre Daten, anstatt Ihrevisa_application
. Um dieses Problem zu lösen ändern Sie einfachzu
und Sie sollten in Ordnung sein. Sie können auch loszuwerden, die Allokation von Speicher für die Knoten in Ihrer
main
Funktion wie das ist, was IhrList::createNode
ist zu tun, soweit ich weiß.OT: das Programm ist voller Lecks, Lesen Sie meine Kommentare auf deine Frage
InformationsquelleAutor N A
Doppelt verkettete Liste sind sehr majorly verwendet in computer-Anwendungen .
Ich fand ein sehr gutes und effizientes Programm für die Doppelt verkettete Liste in eine Website
Einzige Unterschied bertween single linkedlist und doppelt verketteten Liste, ist der zusätzliche Zeiger, die hilft, zu Durchlaufen die verkettete Liste von Links nach rechts oder von-rechts->Links .
Programm für die Doppelt verkettete Liste C++ : http://www.techfinite.net/2013/11/double-linked-list-program-and-algorithm.html
InformationsquelleAutor Lalith Rallabhandi
Ich versuche zu definieren, die auf null-parameter
Node
Konstruktor in derNode
Klasse und setzenpNext = this
undpPrev = this
.Ich habe nicht ausgeführt, das code ist aber, dass Fehler sein könnte, weil Sie fordern eine null-parameter
Node
Konstruktor, aber haben Sie nicht definiert.InformationsquelleAutor Lulu Kay