package main
import "fmt"
/*
使用带head头的单向链表实现 - 水浒英雄排名榜管理
完成对英雄人物的增删改查操作:
第一种方法在添加英雄时,直接添加到链表的尾部
*/
// 定义一个HeroNode
type HeroNode struct {
no int
name string
nickname string
next *HeroNode // 这个标识指向下一个结点
}
// 给链表插入一个结点
// 编写第一种插入方法,在单链表的最后加入 【简单没有太大的实用价值】
func InsertHeroNode(head *HeroNode,newHeroNode *HeroNode) {
//思路
// 1. 先找到该链表的最后这个结点
// 2. 创建一个辅助结点[跑龙套,帮忙]
temp := head
for {
if temp.next == nil { // 表示找到最后了
break
}
temp = temp.next // 让temp不断的指向下一个结点
}
// 3. 将newHeroNode加入到链表的最后
temp.next = newHeroNode
}
// 编写第二种插入方法,根据no的编号从小到大插入
func InsertHeroNodeSort(head *HeroNode,newHeroNode *HeroNode) {
//思路
// 1. 找到适当的结点位置
// 2. 创建一个辅助结点[跑龙套,帮忙]
temp := head
flag := true
// 让插入的结点no,和temp的下一个结点的no 进行比较
for {
if temp.next == nil { //说明到链表的最后了
break
} else if temp.next.no >= newHeroNode.no {
// 说明newHeroNode 就应该插入到temp后面
break
} else if temp.next.no == newHeroNode.no {
// 说明我们的链表中已经有这个no了,就不允许插入
flag = false
break
}
temp = temp.next
}
if !flag {
fmt.Println("对不起,已经存在这个no了,no=",newHeroNode.no)
return
} else {
newHeroNode.next = temp.next
temp.next = newHeroNode
}
}
// 删除一个结点
func DelHeroNode(head *HeroNode, id int) {
temp := head
flag := false
// 找到要删除的结点no,和temp的下一个结点的no做比较
for {
if temp.next == nil { //说明到链表的最后了
break
} else if temp.next.no == id {
// 说明我们找到了
flag = true
break
}
temp = temp.next
}
if flag { // 等于true,说明找到了,之后进行删除
temp.next = temp.next.next
} else {
fmt.Println("sorry,要删除的id不存在..")
}
}
// 更新一个结点
func UpdateHeroNode(head *HeroNode, id int,updateHero *HeroNode) {
temp := head
flag := false
// 找到要删除的结点no,和temp的下一个结点的no做比较
for {
if temp.next == nil { //说明到链表的最后了
break
} else if temp.next.no == id {
// 说明我们找到了
flag = true
break
}
temp = temp.next
}
if flag { // 等于true,说明找到了,之后进行删除
temp.next.name = updateHero.name
temp.next.nickname = updateHero.nickname
} else {
fmt.Println("sorry,要更新的id不存在..")
}
}
// 查询一个结点
func SelectHeroNode(head *HeroNode, id int) {
temp := head
flag := false
// 找到要删除的结点no,和temp的下一个结点的no做比较
for {
if temp.next == nil { //说明到链表的最后了
break
} else if temp.next.no == id {
// 说明我们找到了
flag = true
break
}
temp = temp.next
}
if flag { // 等于true,说明找到了,之后进行现实
fmt.Println("根据ID 查询到的英雄信息:",*temp.next)
} else {
fmt.Println("sorry,要查询的id不存在..")
}
}
// 显示链表的所有结点信息
func ListHeroNode(head *HeroNode) {
// 1. 创建一个辅助结点[跑龙套,帮忙]
temp := head
// 先判断该链表是不是一个空的链表
if temp.next == nil {
fmt.Println("空空如也...")
return
}
// 2. 遍历这个链表
for {
fmt.Printf("[%d,%s,%s]==>",temp.next.no,temp.next.name,temp.next.nickname)
// 判断是否到了链表最后
temp = temp.next
if temp.next == nil {
break
}
}
}
func main() {
// 1. 先创建一个头结点,
head := &HeroNode{}
// 2. 创建一个新的HeroNode
hero1 := &HeroNode{
no: 1,
name: "宋江",
nickname: "及时雨",
}
hero2 := &HeroNode{
no: 2,
name: "卢俊义",
nickname: "玉麒麟",
}
hero3 := &HeroNode{
no: 3,
name: "林冲",
nickname: "豹子头",
}
hero4 := &HeroNode{
no: 3,
name: "吴用",
nickname: "智多星",
}
hero5 := &HeroNode{
name: "武松",
nickname: "打虎英雄~",
}
// 3. 加入
InsertHeroNodeSort(head,hero3)
InsertHeroNodeSort(head,hero4)
InsertHeroNodeSort(head,hero1)
InsertHeroNodeSort(head,hero2)
// 4. 显示
ListHeroNode(head)
// 5. 删除
DelHeroNode(head,3)
DelHeroNode(head,1)
// 6. 更新
UpdateHeroNode(head,2,hero5)
fmt.Println()
// 7. 查询
SelectHeroNode(head,3)
ListHeroNode(head)
}
golang 单链表的实现增删改查
于 2023-05-15 01:25:46 首次发布