go实现循环链表

需求

实现循环链表的节点生成、顺序遍历、指定删除。

实现

go 复制代码
package main

import (
	"fmt"
)

type zodiac_sign struct {
	number int
	dizhi  string
	animal string
	year   int
	next   *zodiac_sign
}

// 添加
// func add_node_by_order(previous_node zodiac_sign, current_node zodiac_sign) zodiac_sign {
func add_node_by_order(previous_node *zodiac_sign, current_node *zodiac_sign) *zodiac_sign {
	if (previous_node.number+1 == current_node.number) || (previous_node.number == 12 && current_node.number == 1) {
		previous_node.next = current_node
		fmt.Printf("节点%s的next指针已指向节点%s的地址%p\n", previous_node.animal, current_node.animal, previous_node.next)
		return current_node
	} else {
		fmt.Printf("顺序错误:禁止添加新节点%s\n", current_node.animal)
		return previous_node
	}
}

// 查找
func check_node_by_order(start_node *zodiac_sign, current_node *zodiac_sign) {
	if current_node.next != start_node {
		fmt.Printf("%d年为%s年\n", current_node.year, current_node.animal)
		check_node_by_order(start_node, current_node.next)
	} else {
		fmt.Printf("最后一年为%d年,是%s年\n", current_node.year, current_node.animal)
	}
}

// 删除
func delete_node_by_id(current_node *zodiac_sign, id int) {
	if id < 1 || id > 12 {
		fmt.Print("输入参数不在范围内!\n")
	} else {
		if (current_node.number + 1) == id {
			fmt.Printf("成功找到节点%s\n", current_node.next.animal)
			current_node.next = current_node.next.next
			fmt.Printf("节点%s的next指针已经指向%s\n", current_node.animal, current_node.next.animal)
		} else {
			delete_node_by_id(current_node.next, id)
		}
	}
}

func main() {

	mouse := &zodiac_sign{number: 1, dizhi: "子", animal: "鼠", year: 2020}
	cow := &zodiac_sign{number: 2, dizhi: "丑", animal: "牛", year: 2021}
	tiger := &zodiac_sign{number: 3, dizhi: "寅", animal: "虎", year: 2022}
	rabbit := &zodiac_sign{number: 4, dizhi: "卯", animal: "兔", year: 2023}
	dragon := &zodiac_sign{number: 5, dizhi: "辰", animal: "龙", year: 2024}
	snake := &zodiac_sign{number: 6, dizhi: "巳", animal: "蛇", year: 2025}
	horse := &zodiac_sign{number: 7, dizhi: "午", animal: "马", year: 2026}
	sheep := &zodiac_sign{number: 8, dizhi: "未", animal: "羊", year: 2027}
	monkey := &zodiac_sign{number: 9, dizhi: "申", animal: "猴", year: 2028}
	cock := &zodiac_sign{number: 10, dizhi: "酉", animal: "鸡", year: 2029}
	dog := &zodiac_sign{number: 11, dizhi: "戌", animal: "狗", year: 2030}
	pig := &zodiac_sign{number: 12, dizhi: "亥", animal: "猪", year: 2031}

	p := add_node_by_order(mouse, cow)

	p = add_node_by_order(p, cow)
	p = add_node_by_order(p, tiger)
	p = add_node_by_order(p, rabbit)
	p = add_node_by_order(p, dragon)
	p = add_node_by_order(p, snake)
	// 错误连接
	add_node_by_order(p, pig)

	p = add_node_by_order(p, horse)
	p = add_node_by_order(p, sheep)
	p = add_node_by_order(p, monkey)
	// 错误连接
	add_node_by_order(p, rabbit)

	p = add_node_by_order(p, cock)
	p = add_node_by_order(p, dog)
	p = add_node_by_order(p, pig)

	p = add_node_by_order(pig, mouse)

	check_node_by_order(mouse, mouse)

	delete_node_by_id(rabbit, 5)
}
powershell 复制代码
节点鼠的next指针已指向节点牛的地址0xc000030180
顺序错误:禁止添加新节点牛
节点牛的next指针已指向节点虎的地址0xc0000301c0
节点虎的next指针已指向节点兔的地址0xc000030200
节点兔的next指针已指向节点龙的地址0xc000030240
节点龙的next指针已指向节点蛇的地址0xc000030280
顺序错误:禁止添加新节点猪
节点蛇的next指针已指向节点马的地址0xc0000302c0
节点马的next指针已指向节点羊的地址0xc000030300
节点羊的next指针已指向节点猴的地址0xc000030340
顺序错误:禁止添加新节点兔
节点猴的next指针已指向节点鸡的地址0xc000030380
节点鸡的next指针已指向节点狗的地址0xc0000303c0
节点狗的next指针已指向节点猪的地址0xc000030400
节点猪的next指针已指向节点鼠的地址0xc000030140
2020年为鼠年
2021年为牛年
2022年为虎年
2023年为兔年
2024年为龙年
2025年为蛇年
2026年为马年
2027年为羊年
2028年为猴年
2029年为鸡年
2030年为狗年
最后一年为2031年,是猪年
成功找到节点龙
节点兔的next指针已经指向蛇
相关推荐
艾莉丝努力练剑1 小时前
【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
c语言·开发语言·数据结构·学习·算法·链表·排序算法
java叶新东老师3 小时前
goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
开发语言·后端·golang
艾莉丝努力练剑4 小时前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
KarrySmile6 小时前
Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
算法·链表·面试·双指针法·虚拟头结点·环形链表
Codeking__11 小时前
链表算法综合——重排链表
网络·算法·链表
五岁小孩12 小时前
Go 原理之 GMP 并发调度模型
golang·gmp·并发调度模型
Hello.Reader1 天前
Go-Elasticsearch v9 安装与版本兼容性
elasticsearch·golang·jenkins
五岁小孩1 天前
实操使用 go pprof 对生产环境进行性能分析(问题定位及代码优化)
性能优化·golang·pprof
一杯科技拿铁1 天前
Go 的时间包:理解单调时间与挂钟时间
开发语言·后端·golang
线程A1 天前
Go 语言函数设计原则:避免修改传入参数
golang