2017-04-13 74 views
0

我是自學C#,我對圖結構中的節點有點困惑。到目前爲止,我拼湊起來的這個代碼,但我不知道如何刪除和整個節點從列表:從圖結構中刪除節點c#

public class Graph 
{ 
    private int _V; 
    private int _E; 
    private LinkedList<Int32>[] adj; 

    public Graph(int V) 
    { 
     this._V = V; 
     adj = new LinkedList<Int32>[_V]; 
     for (int v = 0; v < _V; v++) 
     { 
      adj[v] = new LinkedList<Int32>(); 
     } 
    } 

    public void AddEdge(int v, int w) 
    { 
     _E++; 
     adj[v].AddFirst(w); 
     adj[w].AddFirst(v); 
    } 

    public void RemoveEdge(int v, int w) 
    { 
     _E--; 
     adj[v].Remove(w); 
     adj[w].Remove(v); 
    } 

    public IEnumerable<Int32> Adj(int v) 
    { 
     return adj[v]; 
    } 

    public int V() 
    { 
     return _V; 
    } 

    public bool isLeaf(int v) 
    { 
     return adj[v].Count() == 1; 
    } 

    public int adjacencies(int v) 
    { 
     return adj[v].Count(); 
    } 

    public String toString() 
    { 
     StringBuilder s = new StringBuilder(); 
     String NEWLINE = Environment.NewLine; 
     s.Append(adj[1].Count + NEWLINE); 
     s.Append(_V + " vertices, " + _E + " edges " + NEWLINE); 
     for (int v = 0; v < _V; v++) { 
      s.Append(String.Format("{0:d}: ", v)); 
      foreach (int w in adj[v]) { 
       s.Append(String.Format("{0:d} ", w)); 
      } 
      s.Append(NEWLINE); 
     } 
     return s.ToString(); 
    } 

} 

所以,如果我有四個節點,其中節點1有一個邊緣2,2具有邊緣3和4,3和4共享一個邊緣,我想完全刪除節點1,因爲它是一片葉子。我可以很容易地刪除邊緣,但該節點仍然保留在我的列表中(沒有邊緣)。我如何完全擺脫1?我認爲我應該能夠做一個adj.Remove(1),但是會拋出一個錯誤。

我意識到這可能是超級簡單的,但我在這裏查看的答案似乎是描述了一些不同的東西,或者我根本沒有得到如何工作。

謝謝!

回答

0

數組不支持刪除。如果您確實需要將「不存在」的概念編碼爲adj,則可以將adj[v]設置爲表示「不存在」的值。例如,

​​

或者,你可以存儲在一個Dictionary<Int32>鄰接。取而代之的

private LinkedList<Int32>[] adj; 

你會

private Dictionary<Int32, LinkedList<Int32>> adj; 

,你可以通過

adj.Remove(v); // don't forget to remove the edges 

刪除頂點v在這兩種情況下,你可能會想要更新的其他方法來處理這樣的「刪除「頂點。

+0

所有的好資料。我現在將值設置爲null(我應該已經在刪除和數組之間建立了連接!)並且像魅力一樣工作。非常感謝! – Brad