我是C#编程的新手,我正在尝试使用adgecency list方法实现图形ADT。这是我对图表的表示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Graph
{
class Program
{
public class Graph
{
private int V;
private int E;
private List<List<int>> adj = new List<List<int>>();
public Graph(int V0)
{
V = V0;
E = 0;
for(int v = 0; v < V0; v++)
adj[v] = new List<int>();
}
public int getV() { return V; }
public int getE() { return E; }
public void addEdge(int v, int w)
{
adj[v].Add(w); // Add w to v`s list
adj[w].Add(v); // add v to w`s list
E++;
}
public string toStr()
{
string s = V.ToString() + "vertices, " + E.ToString() + "edges\n";
for (int v = 0; v < V; v++ )
{
s += v + ":";
foreach(int w in this.adj[v])
s += w.ToString() + " ";
s += '\n';
}
return s;
}
}
static void Main()
{
Graph g = new Graph(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(0, 3);
g.addEdge(1, 2);
g.addEdge(2, 3);
Console.WriteLine(g.toStr());
}
}
}
但是当我编译它时,编译器表示这行代码:
adj[v] = new List<int>();
并抛出一个System.ArgumentOutOfRangeException
。
如果有人有任何想法我的代码有什么问题我会很感激。
答案 0 :(得分:2)
您需要添加子列表,因为此时adj
为空。
for(int v = 0; v < V0; v++)
adj.Add(new List<int>());
答案 1 :(得分:1)
在adj[v] = new List<int>();
中,你试图将元素设置在v
位置。但adj
最初为空,您收到此异常,因为位置“v”无效。
相反,您可以添加新列表:
for(int v = 0; v < V0; v++)
adj.Add(new List<int>())
或者如果您愿意,可以将adj
更改为数组类型并使用索引版本:
private List<int>[] adj;
...
public Graph(int V0)
{
V = V0;
E = 0;
adj = new List<int>[V0];
for(int v = 0; v < V0; v++)
adj[v] = new List<int>();
}