使用Go的container/list构建邻接表遇空指针错误,求结构指导
Go邻接表构建问题解答
错误原因
你遇到的panic是因为map中对应节点的*list.List指针未初始化。make(map[int]*list.List, 7)仅初始化了map的容量,但map内每个键(如节点1、2、3)对应的List指针默认都是nil,调用PushBack时会触发nil指针引用的panic。另外原代码中AddEdge函数传递的是SocialGraph值类型,修改的是副本,主函数内的图结构不会被实际更新。
修正后的代码
package main import ( "container/list" "fmt" ) type SocialGraph struct { V int Arr map[int]*list.List } // 传递指针类型,确保修改作用于原对象 func AddEdge(g *SocialGraph, i, j int, undir bool) { // 初始化节点i的邻居列表(如果不存在) if g.Arr[i] == nil { g.Arr[i] = list.New() } g.Arr[i].PushBack(j) if undir { // 初始化节点j的邻居列表(如果不存在) if g.Arr[j] == nil { g.Arr[j] = list.New() } g.Arr[j].PushBack(i) } } func PrintEdgeList(g *SocialGraph) { for i := 1; i <= g.V; i++ { // 节点从1到6,无需遍历0 fmt.Printf("节点%d的邻居:", i) if g.Arr[i] != nil { for e := g.Arr[i].Front(); e != nil; e = e.Next() { fmt.Printf("%d ", e.Value.(int)) } } fmt.Println() } } func main() { graph := SocialGraph{V: 6, Arr: make(map[int]*list.List, 7)} AddEdge(&graph, 1, 3, true) AddEdge(&graph, 2, 3, true) AddEdge(&graph, 2, 4, true) AddEdge(&graph, 1, 5, true) AddEdge(&graph, 1, 6, true) PrintEdgeList(&graph) }
类型选择说明
map[int]*list.List是正确的选择:每个节点对应一个邻居链表,*list.List是链表的指针,能直接调用链表的操作方法(如PushBack),符合邻接表的结构需求。map[int][]list.List是错误的:这表示每个节点对应链表的切片,完全不符合邻接表“一个节点对应一个邻居列表”的逻辑,属于结构设计错误。
内容的提问来源于stack exchange,提问作者Newt
相关产品推荐
相关产品推荐

