(一)用go實現單鏈表
阿新 • • 發佈:2021-08-16
本篇,我們用go簡單的實現單鏈表這種資料結構。
1.節點定義
type Node struct{
data int
next *Node
}
2.節點的新增
// 尾插法插入節點 func (p *Node) Append(data int) { for p.next != nil { p = p.next } var newNode *Node = new(Node) newNode.data = data p.next = newNode fmt.Printf("插入資料:%d\n", data) }
3.節點的刪除
// 刪除尾節點並返回其值 func (p *Node) Pop() (int, error) { if p.next == nil { return 0, errors.New("Error: pop from empty list!") } var tmp *Node for p.next != nil { tmp = p p = p.next } tmp.next = nil fmt.Printf("刪除資料:%d\n", p.data) return p.data, nil }
4.節點的查詢
// 查詢第i個節點的值
func (p *Node) Find(i int) (int, error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return 0, errors.New("Error: the node not exist!")
}
return p.data, nil
}
5.節點的修改
// 修改第i個節點的值 func (p *Node) Update(i, data int) (error) { for p.next != nil && i > 0 { p = p.next i -= 1 } if i > 0 { return errors.New("Error: the node not exist!") } p.data = data return nil }
6.節點的遍歷
// 遍歷輸出
func (p *Node) Traverse() {
fmt.Printf("遍歷結果:")
for p.next != nil {
fmt.Printf("%d ", p.next.data)
p = p.next
}
fmt.Printf("\n")
}
7.測試程式碼
func main() {
var head *Node
head = new(Node)
for a := 0; a < 10; a++ {
head.Append(a)
}
head.Traverse()
data, err := head.Pop()
if err != nil {
fmt.Println(err)
}
fmt.Printf("Pop返回資料:%d\n", data)
head.Traverse()
data, err = head.Find(3)
if err != nil {
fmt.Println(err)
}
fmt.Printf("查詢的資料為:%d\n", data)
err = head.Update(2, 20)
if err != nil {
fmt.Println(err)
}
head.Traverse()
}
// 測試結果
插入資料:0
插入資料:1
插入資料:2
插入資料:3
插入資料:4
插入資料:5
插入資料:6
插入資料:7
插入資料:8
插入資料:9
遍歷結果:0 1 2 3 4 5 6 7 8 9
刪除資料:9
Pop返回資料:9
遍歷結果:0 1 2 3 4 5 6 7 8
查詢的資料為:2
遍歷結果:0 20 2 3 4 5 6 7 8
8.完整程式碼
package main
import (
"fmt"
"errors"
)
type Node struct{
data int
next *Node
}
// 遍歷輸出
func (p *Node) Traverse() {
fmt.Printf("遍歷結果:")
for p.next != nil {
fmt.Printf("%d ", p.next.data)
p = p.next
}
fmt.Printf("\n")
}
// 尾插法插入節點
func (p *Node) Append(data int) {
for p.next != nil {
p = p.next
}
var newNode *Node = new(Node)
newNode.data = data
p.next = newNode
fmt.Printf("插入資料:%d\n", data)
}
// 刪除尾節點並返回其值
func (p *Node) Pop() (int, error) {
if p.next == nil {
return 0, errors.New("Error: pop from empty list!")
}
var tmp *Node
for p.next != nil {
tmp = p
p = p.next
}
tmp.next = nil
fmt.Printf("刪除資料:%d\n", p.data)
return p.data, nil
}
// 查詢第i個節點的值
func (p *Node) Find(i int) (int, error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return 0, errors.New("Error: the node not exist!")
}
return p.data, nil
}
// 修改第i個節點的值
func (p *Node) Update(i, data int) (error) {
for p.next != nil && i > 0 {
p = p.next
i -= 1
}
if i > 0 {
return errors.New("Error: the node not exist!")
}
p.data = data
return nil
}
func main() {
var head *Node
head = new(Node)
for a := 0; a < 10; a++ {
head.Append(a)
}
head.Traverse()
data, err := head.Pop()
if err != nil {
fmt.Println(err)
}
fmt.Printf("Pop返回資料:%d\n", data)
head.Traverse()
data, err = head.Find(3)
if err != nil {
fmt.Println(err)
}
fmt.Printf("查詢的資料為:%d\n", data)
err = head.Update(2, 20)
if err != nil {
fmt.Println(err)
}
head.Traverse()
}