2016-03-30 13 views
0

Ich erstelle ein Programm, das Daten aus einer Tabelle im CSV-Format lesen muss und es einer doppelt verknüpften Liste in C++ zuweist.Ich habe eine einfach verknüpfte Liste erstellt, aber ich bin bei ein Verlust, wie man diese Idee benutzt, um eine doppelt verknüpfte Liste zu bilden. Ich verstehe, dass Sie einen vorherigen Zeiger benötigen, aber ich bin mir nicht sicher, ob ich den Code tatsächlich implementieren soll.Erstellen Sie eine doppelt verkettete Liste in C++

Code für meine einfach verkettete Liste: zur Liste hinzuzufügen:

if (!m_head) 
{ 
    m_head = new Node(name, reference,latitude,longitude); 
} 
else 
{ 
    Node *current = m_head; 
    while (current->getNext() != 0) 
    { 
     current = current->getNext(); 
    } 
    current->setNext(new Node(name, reference,latitude,longitude)); 
} 

Bitte beachten Sie: Knoten eine separate Klasse ist zum Speichern von Daten über den Knoten z.B. Name.

+6

[std :: list] (http://en.cppreference.com/w/cpp/container/list) ist eine doppelt verkettete Liste. – Maikel

+0

Das Klassenobjekt benötigt eine weitere Referenz zum vorherigen Knoten. Die Funktionen der Klasse müssen am meisten geändert werden, z. B. Hinzufügen muss eine Referenz verwenden, um den neuen vorherigen Knoten zu halten, sodass die vorherige Knotenreferenz des neuen Knotens dieser zugewiesen werden kann. Die Logik ist ziemlich einfach. –

+0

Müssen Sie etwas selbst implementieren? – alessalessio

Antwort

2

Jeder Listenknoten muss einen Zeiger auf den vorherigen und den nächsten Listenknoten haben. Die Liste ist dann der Container von Listenknoten, die als Kette miteinander verbunden sind.

struct ListNode; 

typedef struct ListNode { 
    struct ListNode *next; 
    struct ListNode *prev; 
    void *value; 
} ListNode; 

typedef struct List { 
    int count; 
    ListNode *first; 
    ListNode *last; 
} List; 

Sie müssen dann die Methoden Push und Pop entsprechend implementieren. Der schwierige Teil ist die Methode entfernen. Speichern Sie die beiden Zeiger des vorherigen und nächsten Knoten, die Sie löschen möchten, und dann ordnen sie entsprechend zum vorhergehenden und folgenden Knoten:

ListNode *after = node->next; 
ListNode *before = node->prev; 
after->prev = before; 
before->next = after; 

Dieser Artikel kann Ihnen helfen, vollständige Code und Erklärung

http://c.learncodethehardway.org/book/ex32.html

+0

Sie sollten keine Link-Only-Antworten geben. Zitiere den relevantesten Teil in dieser Antwort. – Dennis

+0

Fertig. Der relevanteste Teil wurde hinzugefügt – alessalessio

Verwandte Themen