https://segmentfault.com/a/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package main
//链表实现
import (
"fmt"
"os"
)
//定义错误常量
const (
ERROR = -1000000001
)
//定义元素类型
type Element int64
//定义节点
type LinkNode struct {
Data Element //数据域
Nest *LinkNode //指针域,指向下一个节点
}
//函数接口
type LinkNoder interface {
Add(head *LinkNode, new *LinkNode) //后面添加
Delete(head *LinkNode, index int) //删除指定index位置元素
Insert(head *LinkNode, index int, data Element) //在指定index位置插入元素
GetLength(head *LinkNode) int //获取长度
Search(head *LinkNode, data Element) //查询元素的位置
GetData(head *LinkNode, index int) Element //获取指定index位置的元素
}
//添加 头结点,数据
func Add(head *LinkNode, data Element) {
point := head //临时指针
for point.Nest != nil {
point = point.Nest //移位
}
var node LinkNode //新节点
point.Nest = &node //赋值
node.Data = data
head.Data = Element(GetLength(head)) //打印全部的数据
if GetLength(head) > 1 {
Traverse(head)
}
}
//删除 头结点 index 位置
func Delete(head *LinkNode, index int) Element {
//判断index合法性
if index < 0 || index > GetLength(head) {
fmt.Println("please check index")
return ERROR
} else {
point := head
for i := 0; i < index-1; i++ {
point = point.Nest //移位
}
point.Nest = point.Nest.Nest //赋值
data := point.Nest.Data
return data
}
}
//插入 头结点 index位置 data元素
func Insert(head *LinkNode, index int, data Element) {
//检验index合法性
if index < 0 || index > GetLength(head) {
fmt.Println("please check index")
} else {
point := head
for i := 0; i < index-1; i++ {
point = point.Nest //移位
}
var node LinkNode //新节点,赋值
node.Data = data
node.Nest = point.Nest
point.Nest = &node
}
}
//获取长度 头结点
func GetLength(head *LinkNode) int {
point := head
var length int
for point.Nest != nil {
length++
point = point.Nest
}
return length
}
//搜索 头结点 data元素
func Search(head *LinkNode, data Element) {
point := head
index := 0
for point.Nest != nil {
if point.Data == data {
fmt.Println(data, "exist at", index, "th")
break
} else {
index++
point = point.Nest
if index > GetLength(head)-1 {
fmt.Println(data, "not exist at")
break
}
continue
}
}
}
//获取data 头结点 index位置
func GetData(head *LinkNode, index int) Element {
point := head
if index < 0 || index > GetLength(head) {
fmt.Println("please check index")
return ERROR
} else {
for i := 0; i < index; i++ {
point = point.Nest
}
return point.Data
}
}
//遍历 头结点
func Traverse(head *LinkNode) {
point := head.Nest
for point.Nest != nil {
fmt.Println(point.Data)
point = point.Nest
}
fmt.Println("Traverse OK!")
}
//主函数测试
func main() {
var head LinkNode = LinkNode{Data: 0, Nest: nil}
head.Data = 0
var nodeArray []Element
for i := 0; i < 10; i++ {
nodeArray = append(nodeArray, Element(i+1+i*100))
Add(&head, nodeArray[i])
}
Delete(&head, 3)
Search(&head, 2032)
Insert(&head, 23, 10010)
Traverse(&head)
fmt.Println("data is", GetData(&head, 6))
fmt.Println("length:", GetLength(&head))
os.Exit(0)
}