Hi
Annahme: Man kann sich darauf verlassen, dass es 50 Elemente gibt.
anf muss gegeben sein, als Zeiger auf erste Element.
zeiger kann immer für das "aktuelle" Element verwendet werden.
Setz zeiger am Anfang auf anf.
Dann gehst du mit zeiger 48 mal ein Element weiter (zeiger = zeiger->next)
Jetzt bist du beim 49.Element.
zeiger->next wäre also das 50., das gelöscht werden soll.
Vorher müssen aber next und prae vom 49. bzw. 51 angepasst werden.
Das Nächste vom 49 aus ist dann ja nicht mehr 50, sondern 51.
Und das Vorige von 51 wird 49
Zeiger steht also auf 49.
Mit einem tmp = zeiger->next hast du 50 in tmp
tmp hat als prae und next 49 und 51.
Das 49->next ja jetzt auf 51 zeigen soll: zeiger->next = tmp->next
Es würde noch den Fall geben, dass es kein 51.Element mehr gibt,
dann wäre next NULL. Aber auch dann funktioniert der Code,
dann zeigt next von 49 eben auf NULL.
Und falls (nur falls) es ein 51 gibt, muss prae von dem jetzt auf 49 zeigen.
Zuerst prüfen, ob tmp->next NULL ist, und wenn nicht muss
tmp->next->prev auf zeiger zeigen.
Damit wäre die Liste selbst wieder OK, zeiger steht am 49. Element,
und man hat irgendwo im Speicher (bei tmp) noch das gelöschte Element allein.
Jetzt muss tmp also noch gelöscht werden
(delete oder free, je nachdem, wie ihr es gelernt habt).
Und wenn man es noch ganz ordentlich haben will
sollte zeiger am Ende am 50. Element stehen, statt am 49.
Da gibts aber wieder die Möglichkeit, dass es jetzt kein 50 mehr gibt
(wenn es zuerst kein 51 gegeben hat).
Also zeiger eins weiter mit zeiger = zeiger->next,
aber nur, wenn zeiger->next nicht NULL ist.