Aus verkettete Liste löschen *verzweifel*
-
Ich habe erfolgreich eine Liste von Autos erstellt, nun möchte ich wenn RECT position.left < 0, dies ist vereinfacht in der Delete() Function, dass dieses Auto dann aus der Liste gelöscht wird. Habe schon soviel probiert aber anscheinend habe ich da einen Knoten im Kopf
Im Moment habe ich soviel, nur verliere ich dann einen Teil der Liste
void AutoListe::AutoDelete(void) { Auto *pTemp = pStart; while(pTemp != NULL) { if (pTemp->Delete() == true) { pStart->pNext = pTemp->pNext; } pTemp = pTemp->pNext; } }
Es kann auch sein das mehrere Auto die Delete Function erfüllen, deswegen in einer Schleife. Könnt ihr mir da vielleicht helfen, wäre super nett
Gruß
speedy
-
Ich habe zwar keine Ahnung von C++ aber ich denke mit der Zeile
pStart->pNext = pTemp->pNext;
setzt Du den Zeiger der auf den Anfang zeigt auf das Element nach dem Element, das Zu loeschen willst, d.h. Du loescht alle Autos vor dem Element, welches weg soll. Meiner Meinung nach musst Du
pTemp = pTemp->pNext;
schreiben.
-
Bloedsinn!! Entschuldige bitte! Das muesste gehen:
void AutoListe::AutoDelete(void) { Auto *pTemp = pStart; Auto *pTemp2 = pStart; while(pTemp != NULL) { if (pTemp->Delete() == true) { pTemp2->pNext = pTemp->pNext; } pTemp2 = pTemp; /*pTemp2 zeigt auf das Element vor betrachteten*/ pTemp = pTemp->pNext; } }
-
Ich habe mal zwei Kommentare:
1. Wo löscht ihr eigentlich? Ich sehe keinen Aufruf von Free.
2. Was ist wenn der erste Eintrag gelöscht wird? pStart wird nie verändert. Die Integrität der Liste ist nicht gewährleistet.Mein Vorschlag folgt gleich...
-
Vorschlag:
Mach daraus eine doppelt-verkettete Liste und dann:void AutoListe::AutoDelete(void) { Auto *pTemp = pStart; Auto *pTemp2; while (pTemp != NULL) { if (pTemp->Delete() == true) { pTemp2 = pTemp; if (pTemp == pStart) pStart = pStart->next; pTemp = pTemp->next; free(pTemp2); } else pTemp = pTemp->next; } }
-
Sorry, vergiß den Kommentar mit der doppelt-verketteten Liste. Bin auf der Arbeit und schreibe gerade ein Programm mit solch einer Liste. Konnte Arbeit wohl nicht ganz von Vergnügen trennen.
-
Wenn ich jetzt nicht totalen Mist gemacht habe, müsste das hier funktionieren.
Ich weiß nicht wie du Auto organisiert hast, aber ich denke die delete´s gehören da mit hinein.void AutoListe::AutoDelete(void) { Auto *pTemp = pStart; Auto *pNext = pTemp->pNext; while(pNext != NULL) { if (pNext->Delete() == true) { pTemp->pNext = pNext->pNext; delete pNext; } pTemp = pTemp->pNext; pNext = pTemp->pNext; } if (pStart->Delete() == true) { pTmp = pStart->next; delete pStart; pStart = pTmp->next; } }