Listenmodul
-
Hallo,
ich wollte ein Listenmodul programmieren, habs auch getan und alles geht, bis auf meinen Sortieralgorithmus.
List.h:#include <iostream> struct Knoten { int value; Knoten* next; Knoten* prev; }; bool sort(Knoten* head) { if(head->prev) { if(head->value > head->prev->value) { head->prev->prev->next = head; head->prev->next = head->next; head->next->prev = head->prev; head->next = head->next->prev; head->prev->next = head; sort(head); } return(true); } } bool sortieren(Knoten* head) { while(head->next->value) { std::cout << "Jupp" << std::endl; if(head = head->next) { std::cout << "head = head->next;" << std::endl; if(sort(head)) { std::cout << "sort(head);" <<std::endl; } } } return(true); } bool push(Knoten* previous, Knoten* newknoten) { newknoten->prev = previous; newknoten->next = previous->next; previous->next = newknoten; return(true); }
test.cpp
#include "C:/Programme/Microsoft Visual Studio/MyProjects/LIBDAN/List/list.h" #include <iostream> void main() { Knoten head, torpfen, drei, vier; Knoten* lpKnoten; torpfen.value = 12; vier.value = 13; drei.value = 15; head.value = 19; if(push(&head, &torpfen)) { std::cout << "geht" <<std::endl; if(push(&torpfen, &drei)) { std::cout << "geht" << std::endl; if(push(&drei, &vier)) { std::cout << "geht" << std::endl; } } } lpKnoten = &head; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; if(sortieren(&head)) { std::cout << "yuchuu!" << std::endl; } }
Das ergebnis sieht so aus:
geht geht geht 19 12 15 13
Dann kommt ein Fehler, das Listtest.exe einen Fehler gefunden hat und abgebrochen werden muss ???
thx
Glamdring
-
Vielleicht solltest du next und prev mit NULL initialisieren.
-
Das hilft weiter zu kommen, die Ausgabe jetzt:
geht geht geht 19 12 15 13 Jupp head = head->next;
und das selbe Fenster mit Fehler gefunden -> Programm beenden
Gruß
Glamdring
-
Ich habe das Ganze noch mal "überarbeitet", ich schreib am besten den ganzen Source:
List.h#include <iostream> struct Knoten { int value; Knoten* next; Knoten* prev; }; bool init_Knoten(Knoten* head, int value) { head->next = 0; head->prev = 0; head->value = value; return(true); } bool sort(Knoten* head) { if(head->prev->value) { std::cout << "geht: head->prev" << std::endl; if(head->value > head->prev->value) { Knoten* eins; Knoten* zwei; Knoten* vier; std::cout << "Knoten* eins, zwei, vier;" << std::endl; eins = head->prev->prev; zwei = head->prev; vier = head->next; eins->next = head; head->prev = eins; head->next = zwei; zwei->prev = head; zwei->next = vier; vier->prev = zwei; sort(head); return(true); } else { std::cout << "geht nicht:: head->value" << std::endl; return(true); } } else { std::cout << "geht nicht : if(head->prev)" << std::endl; return(true); } } bool sortieren(Knoten* head) { while(head->next->value) { std::cout << "Jupp" << std::endl; if(head = head->next) { std::cout << "head = head->next;" << std::endl; if(sort(head)) { std::cout << "sort(head);" <<std::endl; } else { std::cout << "geht nicht: sort(head)" << endl; } } } return(true); } bool push(Knoten* previous, Knoten* newknoten) { newknoten->prev = previous; newknoten->next = previous->next; previous->next = newknoten; return(true); }
Test.cpp:
#include "C:/Programme/Microsoft Visual Studio/MyProjects/LIBDAN/List/list.h" #include <iostream> void main() { Knoten head, torpfen, drei, vier; Knoten* lpKnoten; init_Knoten(&head, 15); init_Knoten(&torpfen, 153); init_Knoten(&drei, 19); init_Knoten(&vier, 13); if(push(&head, &torpfen)) { std::cout << "geht" <<std::endl; if(push(&torpfen, &drei)) { std::cout << "geht" << std::endl; if(push(&drei, &vier)) { std::cout << "geht" << std::endl; } } } lpKnoten = &head; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; lpKnoten = lpKnoten->next; std::cout << lpKnoten->value << std::endl; if(sortieren(&head)) { std::cout << "yuchuu!" << std::endl; } }
Dabei bekomme ich folgende Ausgabe:
geht geht geht 15 153 19 13 Jupp head = head->next;
Und dazu mal wieder die Fehlermeldung von wegen beedet werden, blabla.
Eigentlich müsste aber sort (meiner Meinung nach) mindestens noch ein geht... oder geht nicht... ausgeben, tuts aber nicht???
thx
Glamdring