Problem mit dem Umbiegen eines Zeigers (doppelt verkettete Liste)
-
Moin zusammen
Ich kämpfe mich zur Zeit wieder durch doppelt verkettete Listen.
Als Aufgabe haben wir einen recht langen Programmcode bekommen, den wir mit unterschiedlichen Dingen ergänzen sollen, aber um meine anderen Ergänzungen zu testen, muss ich noch an einer bestimmten Stelle "nachfeilen" - dumm nur, das ich genau dort ziemlich auf dem Schlauch stehe.
Würde mich freuen, wenn sich das jemand ein Mal ansehen könnte und mir etwas auf die Sprünge helfen würde.Gegeben wurde u.A.:
typedef struct element { coord c; struct element *prev; // vorheriges Listenelement struct element *next; // naechstes Listenelement } element;
typedef element *iterator; // "iterator" = Zeiger auf ein "element"
Nun sollen wir dazu eine Funktion "next" aufbauen.
Die sieht nun folgendermaßen bei mir aus:
iterator next( iterator pos ) { // Diese Funktion gibt einen Zeiger // auf den Nachfolger von "pos" zurueck printf("Aufruf der Next-Funktion"); return (((element *)pos)->next); }
Hierbei war wiederum alles, bis auf das Printf und den ganzen Returnbefehl vorgegeben. Ich wage zu behaupten, ich habe einen massiven Fehler ins Return gebaut, nur weiß ich nicht recht, wie es anders aussehen sollte.
Folgende Überlegung steht dahinter:
"pos" zeigt auf ein Element. pos->next kann ich allerdings nicht machen, da pos nicht auf das next des Elementes zugreifen kann. Also biege ich soweit an den Zeigern herum, bis ich per (element *)pos->next besagten Zeiger verwenden kann.Wo bitte liegt hier mein Fehler =/?
-
Kannst du mal die Codezeile posten, an der du iterator definierst?
PS: Compilierst du mit -Wall (bei gcc)?
-
Nayamis schrieb:
pos->next kann ich allerdings nicht machen, da pos nicht auf das next des Elementes zugreifen kann.
Warum stellst du eigentlich deine zuvor gestellte Frage nochmal?
-
@ Steffo:
Im main steht noch folgendes:int main ( void ) { list l; coord c; iterator pos; [...] }
Und genau dieses pos wird immer übergeben. In anderer Form tritt es soweit ich es sehe, nicht auf. Müsste ich also meiner Funktion noch etwas hinzufügen?
@Wutz:
Nunja, meine Frage stelle ich eigentlich nur ein Mal. Im unteren Text versuchte ich lediglich, meinen Gedankengang in Worte zu fassen, damit nachzuvollziehen ist, was ich mir dabei gedacht habe
-
Naja, wenn Du am Ende der Liste angekommen bist hat Dein iterator den Wert NULL und wenn Du dann mit ->next reinschauen willst machts wohl bumm
Du kannst mit
return pos != NULL ? pos->next : NULL;
oder wenn dir der ?: Operator suspekt ist mit einem if
if (pos != NULL) return pos->next; else return NULL;
sicherstellen, dass Dein Zugriff erlaubt ist.