Problem Elemente aus dynamischer Liste zu löschen
-
Hallo zusammen,
ich habe folgendes Problem.
Ich habe eine dynamische Liste. Aus dieser Liste möchte ich nun bestimmte Elemente löschen. Die Elemente der Liste sind Strukturen eines bestimmten typs. Da ist eine Variable "selected" drin. ICh möchte nun alle Listenelemente aus der Liste löschen, die in der Variable "selected" eine 0 drin stehen haben.
Ich habe da jetzt mal was geschrieben, um die Elemente zu löschen, aber das funktioniert nicht. Wenn ich die Liste dann weiter benutzen will, kommt früher oder später im Programm ein Fehler, weil irgendein next-Zeiger der liste anscheinend sonswohin zeigt, nur nicht auf das nächste Listenelement.wäre toll, wenn mal jemand über den code schauen und nachsehen könnte, was da falsch ist.
vielen dank.// Die Liste der Individuen wird durchlaufen und es werden alle // Individuen gelöscht, // die in ihrer Variable "selected" eine 0 drin stehen haben pointer_indiv= anfang_indiv; pointer_help_indiv= anfang_indiv->next; while(pointer_help_indiv != NULL) { if(anfang_indiv->selected == 0) { pointer_help_indiv= anfang_indiv->next; delete(anfang_indiv); anfang_indiv= pointer_help_indiv; pointer_indiv= anfang_indiv; pointer_help_indiv= anfang_indiv->next; }/* if(pointer_indiv->selected == 0) */ else if(pointer_help_indiv->selected == 0) { pointer_help_indiv= pointer_help_indiv->next; delete(pointer_indiv->next); pointer_indiv->next= pointer_help_indiv; pointer_help_indiv= pointer_help_indiv->next; } else { pointer_indiv= pointer_indiv->next; pointer_help_indiv= pointer_help_indiv->next; } }/* while(pointer_indiv != Null) */
-
Du solltest dir auch immer einen Pointer auf den Vorgänger mitziehen, da du dessen next-Zeiger beim Löschen umbiegen mußt:
if(pos->next->selected==0) { help=pos->next; pos->next=help->next;//NV-Zeiger korrigieren delete help; } pos=pos->next;(und vor allem solltest du erst deine Zeiger umbiegen und dann das Element löschen)
-
So,
ich habe nochmal ein wenig dran rum gebastelt, aber das Programm bleibt immer noch stehen und zwar in der Zeile:
else if(pointer_lauf_indiv->next->selected == 0)Hier mal mein neuer code:
// Zeiger zeigt auf ds erste Listenelment pointer_lauf_indiv= anfang_indiv; while(pointer_lauf_indiv != NULL) { if(anfang_indiv->selected == 0) { pointer_help_indiv= anfang_indiv->next; anfang_indiv= pointer_help_indiv; delete(pointer_lauf_indiv); pointer_lauf_indiv= pointer_help_indiv; pointer_help_indiv= anfang_indiv->next; }/* if(anfang_indiv->selected == 0) */ else if(pointer_lauf_indiv->next->selected == 0) { pointer_help_indiv= pointer_lauf_indiv->next; pointer_lauf_indiv->next= pointer_help_indiv->next; delete(pointer_help_indiv->next); } else { pointer_help_indiv= pointer_help_indiv->next; pointer_lauf_indiv= pointer_lauf_indiv->next; } }/* while(pointer_lauf-indiv != Null) */
-
visualisier dir das doch mal:
//lauf->D0|next->D1|next help=lauf->next; //lauf->D0|next->D1|next // help-^ lauf->next=help->next; // lauf->D1|next //help->D0|next-^ delete help->next; // lauf->XXX //help->D0|next-^Da siehst du auch deinen Fehler: Du hast nicht das Feld gelöscht, mit dem du eigentlich arbeiten wolltest, sondern dessen Nachfolger in der Liste. Und beim nächsten Schleifendurchlauf versuchst du die Daten zu lesen, die gerade über den Jordan gegangen sind.
Zur Lösung:delete(pointer_help_indiv/*->next - überflüssig*/);