Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从图结构c中删除节点#_C#_Graph - Fatal编程技术网

C# 从图结构c中删除节点#

C# 从图结构c中删除节点#,c#,graph,C#,Graph,我在自学c#,对图形结构中的节点有点困惑。到目前为止,我已经拼凑了这段代码,但我不知道如何从列表中删除和删除整个节点: public class Graph { private int _V; private int _E; private LinkedList<Int32>[] adj; public Graph(int V) { this._V = V; adj = new LinkedList<In

我在自学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();
    }

}
公共类图
{
私人互联网;;
私人国际;
私有链接列表[]adj;
公共图形(INTV)
{
这个;
adj=新链接列表[u V];
对于(int v=0;v<_v;v++)
{
adj[v]=新链接列表();
}
}
公共无效补遗(整数v,整数w)
{
_E++;
adj[v].AddFirst(w);
adj[w].AddFirst(v);
}
公共无效删除(内部v、内部w)
{
_E--;
形容词[v]。去掉(w);
adj[w]。移除(v);
}
公共IEnumerable形容词(int v)
{
返回adj[v];
}
公共INTV()
{
返回V;
}
公共布尔岛(int v)
{
返回adj[v].Count()==1;
}
公共整数邻接(整数v)
{
返回adj[v].Count();
}
公共字符串toString()
{
StringBuilder s=新的StringBuilder();
字符串换行符=Environment.NEWLINE;
s、 追加(adj[1]。计数+换行符);
s、 追加(_V+“顶点”+_E+“边”+换行符);
对于(int v=0;v<_v;v++){
s、 追加(String.Format(“{0:d}:”,v));
foreach(intw在形容词[v]中){
s、 追加(String.Format(“{0:d}”,w));
}
s、 追加(换行符);
}
返回s.ToString();
}
}
所以,如果我有四个节点,其中节点1的边是2,节点2的边是3和4,节点3和4彼此共享一条边,我想完全删除节点1,因为它是一个叶。我可以很容易地删除边,但该节点仍然保留在我的列表中(只是没有边)。我如何完全摆脱1?我想我应该可以只做一个adj.Remove(1),但这会抛出一个错误

我意识到这可能非常简单,但我在这里看到的答案似乎描述了一些不同的东西,或者我根本不明白这是怎么回事


谢谢

阵列不支持删除。如果确实需要将“不存在”的概念编码为
adj
,则可以将
adj[v]
设置为表示“不存在”的值。比如说,

adj[v] = null.
或者,您可以将邻接存储在
字典中。而不是

private LinkedList<Int32>[] adj;

在任何一种情况下,您都可能需要更新其他方法来处理这些“删除”的顶点。

所有好信息。现在我将这些值设置为null(我应该已经建立了删除和数组之间的连接!),并且工作起来很有魅力。非常感谢!
private Dictionary<Int32, LinkedList<Int32>> adj;
adj.Remove(v); // don't forget to remove the edges