package main
import "fmt"
type HeroNode struct {
no int
name string
name2 string
next *HeroNode
}
func InsertHeroNode2(head *HeroNode, newNode *HeroNode) {
tempNode := head
flag := true
for {
if tempNode.next == nil {
break
} else if tempNode.next.no > newNode.next.no {
break
} else if tempNode.next.no == newNode.next.no {
flag = false
break
}
tempNode = tempNode.next
}
if !flag {
fmt.Println("对不起,不允许插入...")
return
}
newNode.next = tempNode.next
tempNode.next = newNode
}
func ListHero(head *HeroNode) {
temp := head
if temp.next == nil {
fmt.Println("这个链表是空链表....")
return
}
for {
fmt.Printf("[%d, %s, %s] == >", temp.next.no,
temp.next.name, temp.next.name2)
temp = temp.next
if temp.next == nil {
break
}
}
}
func main() {
head := &HeroNode{}
hero1 := &HeroNode{
no: 1,
name: "aaa",
name2: "aaa",
}
hero2 := &HeroNode{
no: 2,
name: "bbb",
name2: "bbb",
}
hero3 := &HeroNode{
no: 3,
name: "ccc",
name2: "ccc",
}
InsertHeroNode2(head, hero3)
InsertHeroNode2(head, hero1)
InsertHeroNode2(head, hero2)
ListHero(head)
}
想制作个按顺序排列的单链表,以下是错误,报的错误找了半天没找到,求指点。
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x49849b]
goroutine 1 [running]:
main.InsertHeroNode2(0xc042061f40, 0xc042078060)
D:/goproject/src/go_code/aaa_test001/link/main.go:29 +0x4b
main.main()
D:/goproject/src/go_code/aaa_test001/link/main.go:79 +0x19a
exit status 2
该回答引用GPT:
这段代码中出现了nil指针解引用错误,看出错信息可以知道是在InsertHeroNode2函数的第29行导致的。在这一行,程序试图访问tempNode.next,但是tempNode可能为nil,也就是head为空,因此报错。解决方法是在main函数中创建头节点head来初始化链表。具体方法是:
head := &HeroNode{}
这样就创建了一个头节点,就不会出现nil指针解引用错误了。在后续的代码中,对于没有节点的情况应该加以判断,例如ListHero函数中判断链表是否为空链表,避免出现类似的错误。
如还有疑问,可留言帮助解决。
闭包不是Go语言独有的概念,在很多编程语言中都有闭包
闭包就是解决局部变量不能被外部访问一种解决方案
是把函数当作返回值的一种应用