erste verkettete liste
-
dot schrieb:
CJosef schrieb:
Man castet den Rückgabewert von malloc nicht, siehe Link.
Wenn man will, dass der Code auch gültiges C++ ist, was ich mal als potentiell durchaus erstrebenswert sehen würde, dann schon...
Die Betonung liegt auf wenn.
-
CJosef schrieb:
wintik schrieb:
also wenn ich mir einen hilfszeiger nehme und diesen gleich A setze und dann weiter schiebe hab ich doch wieder das gleiche problem das nach einem free(hilfszeiger) dieser wieder weg ist?
Standard Vorgehen ist vom Ansatz her: next-Zeiger per Hilfszeiger speichern, Vorgänger löschen ... so hangelst du dich durch bis zum Listenende NULL.
ah klar, jetzt wo du es geschrieben hast, hätte mir eigentlich auch einfallen können sollen
CJosef schrieb:
wintik schrieb:
das C mir nicht gerade liegt ist mir auch schon aufgefallen, etwas damit klarkommen muss ich trotzdem, deswegen versuch ich soviel es geht zu verstehen und zu lernen
Das am Anfang nicht gleich alles klappt ist normal, gerade bei C.
Also, nicht entmutigen lassen.danke danke, besonders für die ermutigung
-
do { A->next=B; free(A); A=B; }while (B != NULL);
löschen diese zeilen richtig oder sieht es für mich nur so aus? (also hab noch printList zur kontrolle dahinter,
das hat aber vorher mit der alten while-schleife auch schon nichts mehr angezeigt)
-
Das sieht vermutlich für dich nur so aus. Wie soll denn B jemals NULL werden?
Wenn du das anfangs noch nicht überblickst dann mals dir auf, das ist keine Schande und sehr lehr/hilfreich. Mit rumraten kommste nicht allzu weit...
-
sagen wir mal die liste hat 3 elemente
A->[1|n]->[2|n]->[3|n]->NULL
1.B=A->next;
A->[1|n]B->[2|n]->[3|n]->NULL
2.free(A);
[ | ]B->[2|n]->[3|n]->NULL
3.A=B;
[ | ]B,A->[2|n]->[3|n]->NULL
damit wär man wieder beim ausgangszustand, nur das halt das erste element befreit ist.
dann müsste im 3ten durchlauf es so aussehen
1. B,A->[3|n]->NULL 2. A->[3|n]B->NULL 3. [ | ]B->NULL
ist dann nicht B=NULL? wer sieht den fehler in meiner logik? ^^
-
Bei Zuweisungen steht das Objekt, das verändert werden soll, auf der linken Seite.
-
ach mist, natürlich
do { B=A->next; free(A); A=B; }while (B != NULL);
-
wintik schrieb:
sagen wir mal die liste hat 3 elemente
A->[1|n]->[2|n]->[3|n]->NULL
1.B=A->next;
A->[1|n]B->[2|n]->[3|n]->NULL
2.free(A);
[ | ]B->[2|n]->[3|n]->NULL
3.A=B;
[ | ]B,A->[2|n]->[3|n]->NULL
damit wär man wieder beim ausgangszustand, nur das halt das erste element befreit ist.
dann müsste im 3ten durchlauf es so aussehen
1. B,A->[3|n]->NULL 2. A->[3|n]B->NULL 3. [ | ]B->NULL
ist dann nicht B=NULL? wer sieht den fehler in meiner logik? ^^
Das sieht gut aus, hättest du das mal auch so umgesetzt
wintik schrieb:
do { B=A->next; free(A); A=B; }while (B != NULL);
Das ist noch nicht so prall, das kann noch crashen, wenn A NULL ist!
-
if(A != NULL){ do { B=A->next; free(A); A=B; }while (B != NULL); }
so nicht mehr oder?
-
Stilistisch besser
while ( A != NULL ) { struct sEmpList* B = A; A = A->next; free(B); }
- A wird nie ungültig
- die Freigabe erfolgt zum Schluss
-
okay, ist auch einfacher zu lesen