Verkettung einer Liste ändern? (Zeigeränderungsproblem)
-
Hallo....ich habe eine verkettete Liste, die eingegebene Zahlen aufnimmt und später diese Zahlen 0 aufwärts sortieren soll. (z.b. 0 1 2 3).
Dies hatte beim überschreiben der einzelnen KnotenValues auch geklappt. Nun soll ich aber nicht die Werte ändern, sondern die Verkettung.
Bekomme bei diesem Code aber immer ein Fehler. Nach Eingabe der Zahlen wird nur noch ein Eingabezeichen blinkend angezeigt und das Programm ist "abgestürzt".Code (Problem bei der Sortierung ganz unten in der SortList() Funktion):
#include <iostream> using std::cin; using std::cout; // ListenKnotenstruktur struct ListNode { int iValue; ListNode *pNext; }; // Funktionen deklarieren // Vorne Einfügen ListNode *AddListFront(ListNode *l, int value); // Liste Anzeigen void ShowList(ListNode *l); // Liste sortieren void SortList(ListNode *l); // main-Funktion int main() { // Startzeiger der auf den 1.Listenknoten oder auf NULL ( bei leerer Liste) zeigt ListNode *Liste = NULL; int zahl=0; // Zahlen hinzufügen cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); cin >> zahl; Liste = AddListFront(Liste,zahl); // Liste Sortieren SortList(Liste); // Liste anzeigen ShowList(Liste); } // Funktionen // Vorne Einfügen ListNode *AddListFront(ListNode *l, int value) { // Knoten erzeugen ListNode *p; p = (ListNode *) malloc(sizeof(ListNode)); // Werte zuweisen p->iValue = value; // Zeiger zuweisen p->pNext = l; l = p; return l; } // Liste Anzeigen void ShowList (ListNode *l) { cout << "\nDie Liste:\n"; while ( l!=NULL ) { cout << l->iValue << ' '; l = l->pNext; } cout << '\n'; } // Liste sortieren void SortList(ListNode *l) { ListNode *l2=l; ListNode *pHelp; int data=0; int i=0; // Anzahl Listenelemente zählen while ( l2!=NULL ) { i++; l2=l2->pNext; } // l2 wiederherstellen l2=l; // Sortierung for (int index=0;index<i;index++) { l2=l; /*Problemstart*/ while ( (l2->pNext!=NULL) && (l2->pNext->pNext!=NULL) ) { if ( (l2->pNext->iValue) > (l2->pNext->pNext->iValue) ) { pHelp = l2->pNext; l2->pNext = l2->pNext->pNext; l2->pNext->pNext = l2->pNext->pNext->pNext;; l2->pNext->pNext->pNext = pHelp; } l2 = l2->pNext; } } }
-
Mal abgeshen davon, dass du da C++ machst (zumindest teilweise) und dein SortList durchaus auch das erste Element umsortieren sollte, wird dein Problem beim verbiegen der Zeiger sein.
Nimm mal mehr Hilfszeiger (wie pHelp). Denn beiml2->pNext = l2->pNext->pNext;
verbiegst du schon die ReihenfolgepHelp = l2->pNext; l2->pNext = l2->pNext->pNext; // pNext zeigt jetzt auf das übernächst Element l2->pNext->pNext = l2->pNext->pNext->pNext; // Das überübernächste Element zeigt jetzt auf .... l2->pNext->pNext->pNext = pHelp;
Nimm einen Debugger oder gib mal die Werte deiner Knoten zum Test nach jeder Tauschaktion aus
printf("l2 : %d | next1 : %d | next2 : %d\n", l2->iValue, l2->pNext->iValue, l2->pNext->pNext->iValue);
Die Reihenfolge der Werte darf sich ändern, aber nicht die Werte.