C# Codeverständinisschwierigkeit

Rukola

Lieutenant
Registriert
Sep. 2005
Beiträge
636
Hallo,

Habe mich bis jetzt nur mit Java beschäftigt, was aber auch schon eine Weile her ist. Nun sitze ich vor Heft 11 der C´t 06 und versuche den Beispielcode zu "Programmieren mit C#, Teil 8: Generische Klassen" zu verstehen.

Es handelt sich dabei um einen ADT Queue:


Code:
    class Queue
    {
        elem first;
        elem last;
        
        public void Enqueue(object o)
        {
             last = new elem(o, last);
             if (first == null)
                 first = last;
        }

        public object Dequeue()
        { 
             if (IsEmpty())
                 throw new InvalidOperationException();
             object o = first.value;
             if (first == null)
                 last = null;
             return o;
        }

        public bool IsEmpty()
        {
             return first == null;
        }

        class elem
        {
            public object value;
            public elem next;

            public elem(object val, elem prev)
            {
                value = val;
                if (prev != null)
                    [B]prev.next = this;[/B]
            }
        }
    }

Ich habe etwas Verständinisschwierigkeiten mit dem fett markierten Codestück. Welches Objekt wird "prev.next" durch "this" zugeordnet? Wäre super wenn mir da einer von euch weiterhelfen könnte.


EDIT// hab meine Frage neu formuliert, da ich vorhin ziemlich auf dem Schlauch stand.

Gruß,

Patrick
 
Zuletzt bearbeitet:
Der Konstruktor von elem erlaubt das Erstellen eines Elements, wenn prev == null ist.
Ausserdem kann man ein neues Element hinter ein bestehendes hängen, wenn prev != null ist.
Prev wird mitgeteilt, dass das nächste Element das neu erstellte ist, das passiert durch einen Zeiger auf sich selbst, this.
Prev ist übrigens Previous, also der Vorgänger.
 
Vielen Dank für Deine Antwort! Bin gerade auch drauf gekommen. Meine Programmierkenntnisse sind halt doch stark eingerostet :(


Vielen Dank nochmal,

Patrick
 
Oh, noch eine Frage:

Im Moment wird doch mit der Dequeue() Operation nur das erste Element ausgegeben, jedoch nicht gelöscht bzw. überschrieben. Insofern beinhaltet die Klasse nicht die gesamte Funktionalität einer Queue.

Vervollständigt müsste es doch folgendermaßen heißen:

Code:
public object Dequeue()
        { 
             if (IsEmpty())
                 throw new InvalidOperationException();
             object o = first.value;
             if (first == null)
                 last = null;
             [B]first = first.next;
             if (first.next == null)
                 last = null;[/B]

             return o;
        }

Liege ich da richtig? Ich hoffe ich langweile niemanden mit meinen "Trivialitäten"...
 
Zuletzt bearbeitet:
Jep, das klingt vernünftig.
Edit: Nein, damit bekommst du Schwierigkeiten.
first = first.next; < hier belegst du first mit dem nächsten Element, gut soweit.
if (first.next == null) < hier versuchst du, auf das wiederrum nächste element zuzugreifen, wobei first aber schon null sein kann, ergo NullpointerException
last = null;
Besser wäre:
object o = first.value;
first = first.next;
if (first == null)
last = null;
 
Zuletzt bearbeitet:
Das beruhigt mich :)

Hoffe ich komme einigermaßen schnell wieder in die Materie.


EDIT// Jau stimmt. Das hab ich übersehen. Vielen Dank!

Bis denne,

Patrick
 
Zuletzt bearbeitet:
Zurück
Oben