2017-05-13 4 views
0

ich lerne ein wenig über verknüpfte Liste und doppelt verkettete Liste.C# doppelt verkettete Liste - vorherige und nächste wird nicht verbinden

Ich habe versucht, eine doppelte verkettete Liste mit vorherigen und nächsten Knoten zu erstellen, aber wenn ich das Programm debuggen die "Zeiger" nicht miteinander an den Orten verbinden, wo sie sollen. Am Ende des Laufs des Programms ist der einzige Ausdruck, der ausgedruckt wird, der letzte Wert, den ich in die Liste eingeben wollte, die der EINZIGE Wert in der Liste war.

Dies ist mein Code, ich glaube, es sollte in Ordnung sein, außer für das Problem, wo die 'vorherigen' und die 'nächsten' Knoten nicht miteinander verbunden werden.

Node<T> start; 
    Node<T> end; 

    public void AddFirst(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      start = tmp; 
      end = start; 
     } 
     tmp.next = start.previous; 
     end.next = tmp.previous; 
     start = tmp; 


     if (start.next == null) 
     { 
      end = start; 
     } 
    } 

    public void AddLast(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      AddFirst(dataToAdd); 
     } 

     tmp.next = start.previous; 
     end.next = tmp.previous; 
     end = tmp; 
    } 

    public T RemoveFirst() 
    { 
     if (start == null) return default(T); 

     T saveVal = start.data; 
     end.next = start.next.previous; 
     start = start.next; 
     if (start == null) end = null; 

     return saveVal; 
    } 

    public T RemoveLast() 
    { 
     if (start == null) return default(T); 

     T saveVal = end.data; 
     end.previous.next = start.previous; 
     end = end.previous; 

     if (start == null) end = null; 

     return saveVal; 
    } 


    public void PrintAll() 
    { 
     Node<T> tmp = start; 
     while (tmp != null) 
     { 
      Console.WriteLine(tmp.data); 
      tmp = tmp.next; 
     } 
    } 

    class Node<T> 
    { 
     public T data; 
     public Node<T> next; 
     public Node<T> previous; 

     //etc 

     public Node(T newData) 
     { 
      data = newData; 
      next = null; 
      previous = null; 

     } 

    } 
} 
+0

[Double verlinkte Liste C#] (https://gist.github.com/yetanotherchris/4960171) – CodingYoshi

+0

Ich glaube, Sie sollten einige Komponententests für Ihren Code zu schreiben versuchen, und einen Teil des Codes hinzufügen bei eine Zeit. Insbesondere frage ich, warum 'end.next = tmp.previous;' überhaupt da ist oder mindestens ** zu dieser Zeit **. –

+0

@CodingYoshi Danke! Ich werde deinem Beispiel folgen und prüfen, was ich falsch gemacht habe! – Dolev

Antwort

1

In fast allen Methoden gab es nur wenige Verbindungsprobleme. Ich habe das gleiche modifiziert und es funktioniert gut.

public class DoubleLinkedList <T> 
{ 
    Node<T> start; 
    Node<T> end; 

    public void AddFirst(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      start = tmp; 
      end = start; 
      return; 
     } 
     start.previous = tmp; 
     tmp.next = start; 
     start = tmp; 


     if (start.next == null) 
     { 
      end = start; 
     } 
    } 

    public void AddLast(T dataToAdd) 
    { 
     if (start == null) 
     { 
      AddFirst(dataToAdd); 
      return; 
     } 
     Node<T> tmp = new Node<T>(dataToAdd); 
     end.next = tmp; 
     tmp.previous = end; 
     end = tmp; 
    } 

    public T RemoveFirst() 
    { 
     if (start == null) return default(T); 

     T saveVal = start.data; 
     start = start.next; 
     start.previous = null; 
     if (start == null) end = null; 

     return saveVal; 
    } 

    public T RemoveLast() 
    { 
     if (start == null) return default(T); 

     T saveVal = end.data; 
     end = end.previous; 
     end.next = null; 
     if (start == null) end = null; 

     return saveVal; 
    } 


    public void PrintAll() 
    { 
     Node<T> tmp = start; 
     while (tmp != null) 
     { 
      Console.WriteLine(tmp.data.ToString()); 
      tmp = tmp.next; 
     } 
    } 
} 
+0

Ich habe meinen Code korrigiert. Ich weiß jetzt, wo mein Problem war. Ich musste die Verbindung zwischen den Links mit mehr Schritten unterbrechen, weil ich sowohl Next als auch Previous habe. Danke! – Dolev

+0

Großartig. Wenn es für dich funktioniert hat. Bitte markieren Sie es als Akzeptierte Antwort und geben Sie eine Upvote. :) –

Verwandte Themen