需求
實現雙向鏈表的節點生成、正反向遍歷、指定刪除。
實現
package mainimport ("fmt"
)type zodiac_sign struct {number intdizhi stringanimal stringyear intprevious *zodiac_signnext *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.next = current_nodefmt.Printf("節點%s的next指針已指向節點%s的地址%p\n", previous_node.animal, current_node.animal, previous_node.next)current_node.previous = previous_nodefmt.Printf("節點%s的previous指針已指向節點%s的地址%p\n", current_node.animal, previous_node.animal, current_node.next)return current_node} else {fmt.Printf("順序錯誤:禁止添加新節點%s\n", current_node.animal)return previous_node}
}// 正向查找
func check_node_positive(current_node *zodiac_sign) {if current_node.next == nil {fmt.Printf("正向:最后是%d年、%s年\n", current_node.year, current_node.animal)} else {fmt.Printf("正向:%d年為%s年\n", current_node.year, current_node.animal)check_node_positive(current_node.next)}
}// 反向查找
func check_node_negative(current_node *zodiac_sign) {if current_node.previous == nil {fmt.Printf("反向:最初是%d年、%s年\n", current_node.year, current_node.animal)} else {fmt.Printf("反向:%d年為%s年\n", current_node.year, current_node.animal)check_node_negative(current_node.previous)}
}// 刪除
func delete_node_by_id(current_node *zodiac_sign, id int) {if id < 1 || id > 12 {fmt.Print("輸入參數不在范圍內!\n")} else {if current_node.number == id {fmt.Printf("成功找到節點%s\n", current_node.animal)a := current_node.previous.animalb := current_node.next.animal// fmt.Printf("上一節點為%s、下一節點為%s\n", a, b)x := current_node.previousy := current_node.nextx.next = yy.previous = xfmt.Printf("節點%s的next指針已經指向%s,節點%s的previous指針已經指向%s", a, y.animal, b, x.animal)} else {delete_node_by_id(current_node.next, id)}}
}func main() {p := &zodiac_sign{}//var p *zodiac_signmouse := &zodiac_sign{number: 1, dizhi: "子", animal: "鼠", year: 2020}// var mouse zodiac_sign// mouse.number = 1// mouse.dizhi = "子"// mouse.animal = "鼠"// mouse.year = 2020cow := &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(p, mouse)// fmt.Print(p)head := pp = 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)// fmt.Print(p)check_node_positive(head)check_node_negative(pig)delete_node_by_id(head, 5)
}
節點的next指針已指向節點鼠的地址0xc000030180
節點鼠的previous指針已指向節點的地址0x0
節點鼠的next指針已指向節點牛的地址0xc0000301c0
節點牛的previous指針已指向節點鼠的地址0x0
節點牛的next指針已指向節點虎的地址0xc000030200
節點虎的previous指針已指向節點牛的地址0x0
節點虎的next指針已指向節點兔的地址0xc000030240
節點兔的previous指針已指向節點虎的地址0x0
節點兔的next指針已指向節點龍的地址0xc000030280
節點龍的previous指針已指向節點兔的地址0x0
節點龍的next指針已指向節點蛇的地址0xc0000302c0
節點蛇的previous指針已指向節點龍的地址0x0
順序錯誤:禁止添加新節點豬
節點蛇的next指針已指向節點馬的地址0xc000030300
節點馬的previous指針已指向節點蛇的地址0x0
節點馬的next指針已指向節點羊的地址0xc000030340
節點羊的previous指針已指向節點馬的地址0x0
節點羊的next指針已指向節點猴的地址0xc000030380
節點猴的previous指針已指向節點羊的地址0x0
順序錯誤:禁止添加新節點兔
節點猴的next指針已指向節點雞的地址0xc0000303c0
節點雞的previous指針已指向節點猴的地址0x0
節點雞的next指針已指向節點狗的地址0xc000030400
節點狗的previous指針已指向節點雞的地址0x0
節點狗的next指針已指向節點豬的地址0xc000030440
節點豬的previous指針已指向節點狗的地址0x0
正向:2020年為鼠年
正向:2021年為牛年
正向:2022年為虎年
正向:2023年為兔年
正向:2024年為龍年
正向:2025年為蛇年
正向:2026年為馬年
正向:2027年為羊年
正向:2028年為猴年
正向:2029年為雞年
正向:2030年為狗年
正向:最后是2031年、豬年
反向:2031年為豬年
反向:2030年為狗年
反向:2029年為雞年
反向:2028年為猴年
反向:2027年為羊年
反向:2026年為馬年
反向:2025年為蛇年
反向:2024年為龍年
反向:2023年為兔年
反向:2022年為虎年
反向:2021年為牛年
反向:2020年為鼠年
反向:最初年是0年、年
成功找到節點龍
節點兔的next指針已經指向蛇,節點蛇的previous指針已經指向兔