2017-02-08 4 views
-1

Ich habe wirklich Mühe, diese beiden Methoden zu implementieren. Ich habe den Code aber nur gekämpft, um es in die Praxis umzusetzen. Die ref gibt mir ein Problem, ich hatte es das letzte Mal mit PreOrder, PostOrder und InOrder, aber ich verwendete eine string buffer. Wie kann ich diesen CodeBreite und Tiefe Erste Traverse Implementierung

Ist hier die beiden Methoden

 public void DepthFirstTraverse(T startID, ref List<GraphNode<T>> visited) 
     { 
      LinkedList<T> adj; 
      Stack<T> toVisit = new Stack<T>(); 
      GraphNode<T> current; 
      toVisit.Push(startID); //push the first id onto the stack 

      while (toVisit.Count != 0) 
      { 
       current = GetNodeByID(toVisit.Peek()); 
       adj = current.GetAdjList(); 
       visited.Add(current); 

       foreach (T type in adj) 
       { 
        if (!toVisit.Contains(type) && !visited.Contains(GetNodeByID(type))) 
        { 
         toVisit.Push(type); 
        } 
       } 
      } 
     } 
     public void BreadthFirstTraverse(T startID, ref List<GraphNode<T>> visited) 
     { 
      LinkedList<T> adj; 
      Queue<T> toVisit = new Queue<T>(); 
      GraphNode<T> current; 
      toVisit.Enqueue(startID); 

      while (toVisit.Count != 0) 
      { 
       //get it off from the list 
       T currentID = toVisit.Dequeue(); 
       current = GetNodeByID(currentID); 
       adj = current.GetAdjList(); 
       //add the current to the visited list, so we know where we have been 
       visited.Add(current); 
       foreach (T ID in adj) 
       { 
        if (!toVisit.Contains(ID) && !visited.Contains(GetNodeByID(ID))) 
        { 
         toVisit.Enqueue(ID); 
        } 
       } 
      } 
     } 

Hier ist mein Fehler bei erhalte eine Output-

Console.WriteLine(string.Join, ',', myGraph.BreadthFirstTraverse(myGraph, ref 'a')); 

Ich erhalte diese Fehlermeldung zu arbeits -

Ein Ref- oder Out-Argument muss eine zuweisbare Variable sein

Alle meine anderen Methoden ds funktioniert einwandfrei; IsEmptyGraph(), ContainsGraph(GraphNode<T> node), IsAdjacent(GraphNode<T> from, GraphNode<T> to), AddNode(T id), GraphNode<T> GetNodeByID(T id), AddEdge(T from, T to). Ich frage mich wirklich, wie ich das zur Arbeit bringen soll.

Bitte kann jemand helfen, etwas Licht auf diese bitte zu werfen.

Ich habe den Code, es geht nur darum, alles auszuführen.

EDIT - Ich weiß nur nicht, was in die Parameter übergeben werden.

Antwort

0
myGraph.BreadthFirstTraverse(myGraph, ref 'a') 

A ref oder out-Argument muss eine frei belegbare variabel sein

Sie nicht eine Konstante als ref-Parameter übergeben kann. Wenn Sie müssen dies tun, erstellen Sie es zuerst.

char youCanPassMeAsRef ='a'; 
myGraph.BreadthFirstTraverse(myGraph, ref youCanPassMeAsRef) 
+0

Ich sehe, ich habe immer noch ein Problem mit dem Code. Jetzt habe ich einen Fehler, der sagt 'C# Argument 2: kann nicht konvertieren von 'ref Graph.Graph zu' ref System.Collections.Generic.List > '' – ImTheOneWhoCodes

+0

in diesem Fall müssen Sie nur etwas von der übergeben richtiger Typ. – hometoast

+0

Ja, der Konstruktor ist 'BreadthFirstTraverse (T startID, ref Liste > besucht)', die Start-ID überlasse ich ein char dh 'A', aber die ref Liste macht keinen Sinn, innerhalb meiner Methode gibt es eine Liste ' LinkedList adj; 'aber ich kann nicht scheinen, es zu nennen. – ImTheOneWhoCodes