Forum: PC-Programmierung Java Listen. Verstehe angehängte Methode nicht


von Christin (Gast)


Lesenswert?

Hallo zusammen, ich habe eine Frage zu Listen in Java.
Ich habe hier einen Code, mit dem man Listen erstellen kann.
Ein Beispiel ist in der Main funktion.
Man macht eine neue Liste mit

ConsList l = new ConsList();

und kann dann Sachen einfügen z.B:

l.insert("Hallo")
l.insert("DU!!!")

und dann die liste mit

print(l) ausgeben.

Wie gesagt in der main Funktion sind dazu Beispiele.

Ich verstehe die Methode insert nicht.
Dort wird erst eine neue Zelle angelegt, mit dem Inhalt, den man 
übergibt.
Cons cons = new Cons(obj);

Dann wird diese Zelle auf head zeigen. Also prinzipiell zeigt dann jede 
Zelle auf Head.

Head aber wird im nächsten Schrit gleich cons gesetzt.
Da alle Zellen auf head zeigen, head gleich cons gesetzt wird und cons 
der Inhalt der letzten Zelle ist, heißt das doch alle Zellen  zeigen auf 
die letzte.
Aber wo ist da der Sinn? Das kann  doch so garnicht verstanden werden!?

Es wäre schön, wenn ihr mir helfen könntet ;)
Danke
1
public class Cons 
2
{
3
  public Object obj; // das Objekt in dieser Zelle
4
  public Cons next;  // Verweis auf die naechste Zelle
5
  public Cons(Object obj) {
6
    this.obj = obj;
7
    next = null;
8
  }
9
}
10
11
public class ConsList
12
{
13
  private Cons head, foot; // Kopf und Fuss der Liste
14
  public ConsList() { head = foot = null; /* neue leere Liste */ }
15
  public boolean contains(Object obj) { return contains(head, obj); }
16
  protected boolean contains(Cons cons, Object obj) {
17
    if (cons == null) return false;
18
    else if (cons.obj == obj) return true;
19
    else return contains(cons.next, obj);
20
  }
21
  public void print() {
22
    System.out.print("Liste [");
23
    print(head);         // rekursive Ausgabe der Cons-Zellen
24
    System.out.println("]");
25
  }
26
  protected void print(Cons cons) {
27
    if (cons == null) return ;  // letzte Zelle erreicht
28
    System.out.print(cons.obj); // Objekt ausgeben
29
    if (cons.next != null) {
30
      System.out.print(", ");
31
      print(cons.next);       // Rekursiv weiter 
32
    }
33
  }
34
  public void insert(Object obj) {
35
    Cons cons = new Cons(obj);  // neue Cons-Zelle
36
    cons.next = head;      // vorne anfuegen..
37
    head = cons;        // .. und Kopf der Liste anpassen
38
    if (foot == null) foot = cons; // eventuell auch den Fuss
39
  }
40
  public void append(Object obj) {
41
    Cons cons = new Cons(obj);  // neue Cons-Zelle
42
    if (foot == null) head = foot = cons; // genau eine Cons-Zelle
43
    else { // hinten anfuegen und Fuss anpassen
44
      foot.next = cons;
45
      foot = cons;
46
    }
47
  }
48
  public void remove(Object obj) {
49
    if (head == null) return ;
50
    if (head.obj == obj) {
51
      if (head == foot) foot = head = null;
52
      else head = head.next;  // erste Cons-Zelle entfernen
53
    } else remove(head, head.next, obj);
54
  }
55
  protected void remove(Cons prev, Cons cons, Object obj) {
56
    if (cons == null) return ;
57
    if (cons.obj == obj) {
58
      // vorherige Cons-Zelle auf Nachfolgende zeigen lassen,
59
      // somit faellt 'cons' aus der Liste
60
      prev.next = cons.next;
61
      if (foot == cons)     // evtl. Fuss anpassen
62
        foot = prev;
63
    } else remove(cons, cons.next, obj);
64
  }
65
  public boolean isEmpty() { return head == null;  }
66
  public Object removeHead() {
67
    if (head == null) return null;
68
    Object res = head.obj;
69
    if (head == foot) head = foot = null;
70
    else head = head.next;
71
    return res;
72
  }
73
74
  public static void main (String ... args) {
75
    // Kleines Testprogramm fuer Listen:
76
    ConsList l = new ConsList();
77
    System.out.println("leer? " + l.isEmpty());
78
    String s1 = "Hallo", s2 = "Welt";
79
    l.insert(s1);
80
    System.out.println("leer? " + l.isEmpty());
81
    l.print();
82
    l.insert(s2);
83
    l.print();
84
    l.remove(s2);
85
    l.print();
86
    l.append(s2);
87
    l.print();
88
    l.remove(s2);
89
    l.remove(s1);
90
    l.print();
91
    System.out.println("leer? " + l.isEmpty());
92
  }
93
}

von Uhu U. (uhu)


Lesenswert?

- insert erzeugt zuerst ein neues Listenelement
- weist dem next-Zeiger des neuen Elementes die bisherige Liste zu
- weist dem Listenanker das neue Element zu

Ergo: insert fügt ein neues Element vorne an die Liste an - oder anders 
ausgedrückt: es implementiert eine push-Operation.

von progger (Gast)


Lesenswert?

Du solltest Dich mal etwas näher mit verketteten Listen auseinander 
setzen.
Die Funktion macht nix anderes als ein neues Objekt an den Anfang der 
Liste anzufügen und danach dieses Objekt als Anfang zu deklarieren.
Ist also ganz normal.
Das vorherige Anfangsobjekt ist dann das zweite in der Liste und hängt 
am "next" pointer des ersten Objekts.

von Unbekannter (Gast)


Lesenswert?

> Dann wird diese Zelle auf head zeigen. Also prinzipiell zeigt dann jede
> Zelle auf Head.
>
> Head aber wird im nächsten Schrit gleich cons gesetzt.

Na, dann stimmt die Theorie von verschiedenen Profs. ja doch, dass Java 
das grundsätzliche Verständnis für Zeiger verhindert.

Also, kurze Erklärung:

"head" ist eine Zeiger. In "head" steht praktisch eine Speicheradresse 
drin, an der ein bestimmtes Objekt zu finden ist.

Ein Listenelemeten besteht aus dem Tupel (obj, next).

"obj" ist quasi ein Zeiger auf das Datenobjekt, "next" ist ein Zeiger 
auf das Nächste Listenelement.

In Java sind fast alle Variablen in Wirklichkeit Zeiger (bis auf die 
Integraltypen).

Wenn ein neues Element in die Liste eigefügt wird, wird der 
"next"-Zeiger auf den Wert des "head"-Zeigers gesetzt. Also findet man 
unter "next" nun das gleiche Objekt wie unter "head".

Allerdings kann man das neue Listen-Element noch niergends finden, also 
wird der "head"-Zeiger anschließen auf das neue Listen-Element gesetzt.

Ganz einfach und logisch.

von Christin (Gast)


Lesenswert?

Angenommen ich tippe
insert("Hallo") ein.
Dann wird das Listenelement erzeugt, klar.
Dem next Zeiger von "Hallo" wird dann auf "head" gesetzt ( cons.next = 
head)
und heat wirderrum wird mit cons gleichgesetzt. Also "Hallo" zeigt auf 
sich selber? Mir ist das nicht klar inwiefern das hier erfüllt wird, 
könntet ihr das etwas genauer sagen?

von Uhu U. (uhu)


Lesenswert?

Warum debuggst du dich nicht einfach mal durch den Code? Dann kannst du 
dir alles angucken und verstehst hinterher, was passiert...

von Christin (Gast)


Lesenswert?

Wie meinst du das? Wie kann ichd as mit Eclipse machen? Und inwiefern 
kann ich das dann sehen?

von Uhu U. (uhu)


Lesenswert?

Jeder ordentliche Debugger erlaubt zumindest Objekte anzusehen, sehr oft 
ist es sogar möglich, sie während der Debug-Session zu verändern. 
Natürlich kann man auch Haltepunkte setzen, an denen der Debugger das 
Programm stoppt, damit du nachsehen kannst, was los ist. Wenn du im 
Einzelschrittmodus durch dein Programm tackerst, kannst du sogar Schritt 
für Schritt sehen, was passiert.

Wie das mit Eclipse geht weiß ich nicht - noch nie benutzt. Sieh eben 
mal in der Dokumentation nach, wie man den Java-Debugger anwirft. Da 
kannst du fürs Leben lernen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.