571
社区成员
发帖
与我相关
我的任务
分享go语言没有c++的类,但使用struct并配备几个方法也可以达到同样的效果
定义了LinkTable和LinkNode结构体
type LinkNode struct {
val int
next *LinkNode
}
type LinkTable struct {
pHead *LinkNode
pTail *LinkNode
count int
}
需要注意的是返回值应该是个指针类型
func CreateLinkTable() *LinkTable {
link := &LinkTable{
pHead: nil,
pTail: nil,
count: 0,
}
return link
}
go语言并没有c++的delete操作,而是采用Java一样的垃圾自动回收机制,所以只需要将值初始化就行
详情见:Go垃圾回收算法
func (l *LinkTable) DeleteLinkTable() {
l.pHead = nil
l.pTail = nil
l.count = 0
}
需要注意边界条件
func (l *LinkTable) Add(v int) {
node := LinkNode{v, nil}
if l.count == 0 {
l.pHead = &node
l.pTail = &node
} else {
l.pTail.next = &node
l.pTail = &node
}
l.count++
fmt.Printf("Add value %d\n", v)
return
}
删除指定值的结点,对于头结点要特判
func (l *LinkTable) Delete(v int) {
cur := l.pHead
if l.count == 0 {
return
}
if cur.val == v {
if l.pHead.next != nil {
l.pHead = l.pHead.next
} else {
l.pHead = nil
}
l.count--
return
}
for cur.next != nil {
if cur.next.val == v {
fmt.Printf("Delete value %d\n", v)
if cur.next.next != nil {
cur.next = cur.next.next
} else {
cur.next = nil
}
l.count--
}
cur = cur.next
}
}
func (l *LinkTable) Find(v int) *LinkNode {
if l.count == 0 {
return nil
} else {
cur := l.pHead
for cur.next != nil {
if cur.val == v {
return cur
}
cur = cur.next
}
return nil
}
}
func (l *LinkTable) GetNextNode(v int) *LinkNode {
if l.count == 0 || l.count == 1 {
return nil
} else {
cur := l.pHead
for cur.next != nil {
if cur.val == v {
return cur.next
}
cur = cur.next
}
return nil
}
}
func main() {
var link *LinkTable
link = CreateLinkTable()
link.Add(1)
link.Add(8)
link.Add(3)
link.Add(4)
link.Add(6)
link.Add(2)
link.Add(5)
link.Add(7)
link.Print()
link.Delete(2)
link.Print()
node := link.Find(3)
fmt.Println(*node)
next := link.GetNextNode(6)
fmt.Println(*next)
}
首先插入:1,8,3,4,6,2,5,7
然后删除:2 ,接着查询结点:3
最后查找结点6的下一个结点:5
运行结果如下:

可以看出函数全都测试成功
完整代码链接:https://github.com/1274012370/lab2
作者:335