zeiger,liste

lionq

Grünschnabel
brauche dringend Hilfe...
ich weiß,wie die Listen erstellt werden und mit Zeigern kann ich mittlerweile was anfangen aber ein bestimmten Element zu löschen?



Schreiben Sie ein Programmstück, welches das 50. Element einer Kette löscht. Verwenden Sie dabei NUR die angegebenen Zeiger******

struct
{
*prae;
*next;
} *anf, *zeiger, *tmp;


mfg
 
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.
 
danke für deine Antwort...
würde so gehen?
C++:
zeiger =anf;
	
	for (int i=0; i<50 ; i++)	
		zeiger = zeiger ->next;
	tmp=zeiger;
	zeiger = zeiger->prae;
	zeiger->next = zeiger->next->next;
	zeiger->next->prae = zeiger;
	delete(tmp);//free(tmp);
gibt es kürzere Variante oder was würdest du lieber schreiben?

MFG
 
Vor zeiger->next->prae = zeiger; muss ein if(zeiger->next) hin
Wie gesagt, falls es nur genau 50 Elemente gibt, kein 51...
ohne dem if würde dein Programm abstürzen.

Und wegen der Sache, dass zeiger am Schluss am 50. Element stehen bleibt:
Am Ende noch
C++:
if(zeiger->next)
    zeiger = zeiger->next;

Sonst passts und sollte sich nicht nennenswert verkürzen lassen.
Bzw. gar nicht sinnvoll.
 
so sollte dann sein oder
C++:
zeiger =anf;

for (int i=0; i<50 ; i++)	
    zeiger = zeiger ->next;
tmp=zeiger;
if(zeiger->next)
    zeiger = zeiger->prae;
zeiger->next = zeiger->next->next;
zeiger->next->prae = zeiger;
delete(tmp);//free(tmp);
 
Zuletzt bearbeitet von einem Moderator:
ach so
C++:
zeiger =anf;
 
for (int i=0; i<50 ; i++)   
    zeiger = zeiger ->next;
tmp=zeiger;

 zeiger = zeiger->prae;
zeiger->next = zeiger->next->next;
if(zeiger->next)
zeiger->next->prae = zeiger;
delete(tmp);//free(tmp);
if(zeiger->next)
    zeiger = zeiger->next;
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück