# Liste verstehen...



## Assassin (8. Aug 2009)

Hallo,
ich habe versucht eine Aufgabe zum Thema 'Programmverständnis' zu bearbeiten,
aber habe leider keine Lösung zur Aufgabenstellung gefunden. -.-

Würde mich also freuen, wenn mir jmd. lediglich sagen könnte, 
ob meine Lösung ansatzweise richtig ist.^^
Thx 

*Hier die Aufgabe, bzw. das gegebene Programmfragment:*

```
class N {
int v;
N next;
N(int v) {
this.v = v;
}
}
...
int n = 7,
m = 4;
N t = new N(1),
x = t;
for (int i = 2; i <= n; i++)
x = (x.next = new N(i));
x.next = t;
System.out.print(x.v); // (*)
while (x != x.next) {
for (int i = 1; i < m; i++)
x = x.next;
System.out.print(" " + x.v);
x.next = x.next.next;
}
```

a) Was wird ausgegeben?

b) Wie viele Elemente besitzt die Liste in der Zeile(*)?

*Hier meine Lösung:*
a) Ungefährer Ablauf...(Hoffe, man versteht meine Gedanken )
7 - 6 - 5 - 4 - 3 - 2 - 1

-> v bei (*): 7

7 - 6 - 5 - 1 - 1 - 1 - 1

Ausgabe: ( _ = Leerzeichen)

_ 7 _ 1 _ 1


b) 7


----------



## Marco13 (8. Aug 2009)

Ob ihr wirklich richtig steht, seht ihr, wenn ... also, hast du das ganze einfach mal compiliert und gestartet? (So eine Zeile wie
x.next = x.next.next;
in der Schleife sieht aber schon merkwürdig aus :autsch: Naja - sinnvoll soll es wohl gar nicht sein)


----------



## Assassin (9. Aug 2009)

Nein, habe ich bisher nicht.
War so gegeben und ist halt eher eine 'Pen and Paper' - Aufgabe.

Mhm, aber habe ich zumindest richtig in die Liste eingefügt? oO

Lg


----------



## Marco13 (9. Aug 2009)

Ja, aber um seine Gedankengänge zu verfizieren hilft's vielleicht. Ich hab's gerade mal gestartet... hat die fehlende Einrückung und die besch... Klammerung da irgendeinen Zweck, ausser dass der Leser "Oo *confused* oO" wird?! Wie auch immer. Die 7 stimmt noch ... der Ablauf danach ist halt übelst wirr, wegen der For-Schleife und dem "Löschen"... also, es kommt etwas anderes raus als "7 1 1"

EDIT: Das Einfügen stimmt wohl noch, aber das Löschen und das Endergebnis nicht


----------



## Assassin (9. Aug 2009)

Okay, thx.
Versuche es nachher nochmal und poste mein neues Ergebnis dann.


----------



## Assassin (9. Aug 2009)

Hallo... nochmal^^.
So, ich habe jetzt die Aufgabe ein wenig zerlegt und schreibe mal kurz meinen gedanklichen Ansatz auf...
Mein Problem ist bisher die while-Schleife und die Zeile mit dem x.next.next, aber ... 

Liste nach dem Einfügen: 7 6 ... 1
v bei (*) : 7
und in die while-Schleife gehen, wo dann die for-Schleife 2x ausgeführt wird und die Liste sich entsprechend ändern sollte.
Liste: 6 5 ... 1 
nach dem 2. Durchlauf: 5 4 ... 1

Wäre das bis dahin denn soweit okay? oO

Lg Assa


----------



## Marco13 (9. Aug 2009)

Wenn du sagst, dass die for-Schleife 2x ausgeführt wird, meinst du dann, dass sie 2 durchläufe macht, oder dass sie 2x komplett ausgeführt wird (also 2 mal soundsoviele Durchläufe macht)?

Hab jetzt auch mal Bleistift und Papier ausgepackt:
- Am Anfang ist x=7, und die Liste ist zikulär verkettet. 
- Dann kommt die for-Schleife, die von 1 bis 3 läuft, d.h. in der for-Schleife wandert x von 7 nach 1 nach 2 nach 3.
- x wird ausgegeben (also die 3)
- Dann wird das nächste Element (also die 4) gelöscht
- Dann kommt die for-Schleife, die von 1 bis 3 läuft, d.h. in der for-Schleife wandert x von 3 nach 5 nach 6 nach 7.
- x wird ausgegeben (also die 7)
- Dann wird das nächste Element (also die 1) gelöscht
- Dann kommt die for-Schleife, die von 1 bis 3 läuft, d.h. in der for-Schleife wandert x von 3 nach 2 nach 3 nach 5.
- x wird ausgegeben (also die 5)
....


----------



## Assassin (11. Aug 2009)

Vielen Dank!
Ich meinte damit 2 Durchläufe in der for...Sry.

Soweit habe ich das Vorgehen jetzt wohl verstanden, nur eine Frage bleibt immer noch offen... 

Wir befinden uns ja in der for-Schleife, welche in der while-Schleife ausgefürht wird und das, solange bis x ungleich x.next ist. Das Ungleich irritiert mich iwie...

Ist die Ausgabe dann (nach dreimaligen Druchlaufen der for) 3_7_5 oder (nach häufigerem Druchlaufen, bis die Liste quasi leer ist) 3_7_5_3_3_2 ?

Lg Assa


----------



## Marco13 (11. Aug 2009)

Letzeres - ich habe das Programm zwar gerade nicht hier, aber ich meine, das wäre die Ausgabe gewesen. Die Beschreibung war schon fast richtig: Die while-Schleife bewirkt, dass 
- mit der for-Schleife 3 Schritte im Kreis gelaufen
- das nächste Element gelöscht 
wird, bis die Liste nur noch ein Element enthält.


----------



## Assassin (11. Aug 2009)

Okay, 
dann war ich ja immerhin auf dem richtigen Weg und nicht komplett 'verpeilt'...^^

Nochmal vielen Dank für deine Hilfe!:applaus:
Lg Assa


----------

