我正在通過鄰接串列實作 Graph,并且我正在嘗試將節點添加到 Graph 類但我一直收到錯誤
System.NullReferenceException has been thrown
這是我的代碼的一部分:
MyNode 類
class node
{
public List<object>? Neighbors { get; set; }
public int Data { get; set; }
public node() { }
public node(int val)
{
Data = val;
}
}
這是我的圖表類:
class Graph
{
// Attributes of the Class
public int NumVertices { get; set; } // Number of vertices
public List<node> vertices { get; set; } // list of nodes in the graph
// Graph constructor
public Graph(int size)
{
NumVertices = size;
vertices = new List<node>();
//// Allocate node objects at each index of the vertice list
//for (int i = 0; i < NumVertices; i )
//{
// Instantiate(vertices[i]);
//}
}
//Adding ege to vertice
public void addEdge(node a, node b)
{
a.Neighbors.Add(b); //---> it referenced here
b.Neighbors.Add(a);
}
然后測驗函式: this 實體化節點物件和
public static void TestGraph()
{
node a = new node(1);
node b = new node(2);
node c = new node(3);
node d = new node(4);
node e = new node(5);
node f = new node(6);
Graph myGraph = new Graph(6) ;
//// Add vertices to the node
//myGraph.vertices.Add(a);
//myGraph.vertices.Add(b);
//myGraph.vertices.Add(c);
//myGraph.vertices.Add(d);
//myGraph.vertices.Add(e);
////myGraph.vertices.Add(f);
myGraph.addEdge(a, b); //---> Error originates here
myGraph.addEdge(a, c);
myGraph.addEdge(a, d);
myGraph.addEdge(b, c);
myGraph.addEdge(c, e);
myGraph.addEdge(d, e);
Console.WriteLine("Cheching if a and b are neighbors " myGraph.isAdjacent(a, b).ToString());
Console.WriteLine("Cheching if a and c are neighbors " myGraph.isAdjacent(a, c).ToString());
我將如何糾正這個問題?謝謝
uj5u.com熱心網友回復:
節點物件沒有問題,但它的 Neighbors 欄位應該是一個 List 但建構式沒有對其進行任何初始化。
如果您更改建構式以初始化 Neighbors,則 null 參考錯誤將消失。下面是如何初始化串列的示例。
public node(int val)
{
Data = val;
Neighbors = new List<object>();
}
uj5u.com熱心網友回復:
您從未創建過Neighbors串列,因此它將始終是null.
我會將這些串列制定為帶有初始化程式的僅 getter 屬性。然后串列會自動初始化,你不能忘記稍后再做。
class Node
{
public List<Node> Neighbors { get; } = new();
public int Data { get; set; }
public Node() { }
public Node(int val)
{
Data = val;
}
}
此外,這必須是 a List<Node>,而不是 a List<object>,因為您將始終向其添加節點。或者,Neighbors串列也可以是在串列中List<int>存盤鄰居的索引Graph.Vertices而不是節點本身。
Graph有財產public int NumVertices { get; set; }。不NumVertices等于Vertices.Count?由于您將圖形大小傳遞給建構式,因此將這個數量的節點添加到建構式中的串列是有意義Vertices的。NumVertices然后自動匹配這個大小,因為它回傳Vertices.Count。
class Graph
{
public int NumVertices => Vertices.Count;
public List<Node> Vertices { get; } = new();
public Graph(int size)
{
for (int i = 0; i < size; i ) {
Vertices.Add(new Node());
}
}
public void AddEdge(int i, int j)
{
Node a = Vertices[i];
Node b = Vertices[j];
a.Neighbors.Add(b);
b.Neighbors.Add(a);
}
public bool AreAdjacent(int i, int j)
{
return Vertices[i].Neighbors.Contains(Vertices[j]);
}
}
由于節點存盤在物件中,因此在and方法中傳遞它們的索引而不是保持它們的另一個參考超出物件Graph是有意義的。這更有利于一致性,因為只能在實際位于該圖中的節點之間添加邊。AddEdgeAreAdjacentGraph
添加邊:
var graph = new Graph(6);
graph.AddEdge(0, 1);
graph.AddEdge(0, 2);
graph.AddEdge(0, 3);
graph.AddEdge(1, 2);
graph.AddEdge(2, 4);
graph.AddEdge(3, 4);
uj5u.com熱心網友回復:
myGraph.addEdge(a, b); //---> Error originates here
那么,a的價值是多少?您發布的代碼未初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/503663.html
