本周,拿go练习了数据结构中的单链队列,实现很简单,代码附在最后。
然而在测试到时候惊奇的发现,在InitQ函数中,我明明返回的是LinkQ类型,并没有在这个返回值设置对应的指针类型,而在main函数测试中,我反而拿这个LinkQ类型变量去调用了AddQ方法,而且居然还生效了,注意我AddQ的调用者设置的是指针类型(**LinkQ),
因为我们知道,Go语言中结构体是值传递,所以要想做改变其中成员操作的方法和函数参数,必然要做地址传递。
*
package main
import "fmt"
//实现单链队列,队尾入队,队头出队
//定义队列每个节点属性
type Qnode struct {
data interface{}
next *Qnode
}
//定义队列属性
type LinkQ struct{
head *Qnode //头指针
length int
}
func InitQ()_** LinkQ**_{
return LinkQ{
&Qnode{
0,
nil,
},
0,
}
}
func InitQnode(i interface{})*Qnode{
return &Qnode{
i,
nil,
}
}
func (q *LinkQ)AddQ(node *Qnode)bool{
p:=q.head
for i:=0;i<q.length;i++{
p=p.next
}
node.next=p.next
p.next=node
q.length++
return true
}
func (q *LinkQ)DelQ()bool{
if q.length==0 {
fmt.Println("队是空队列,无法删除")
return false
}
p:=q.head.next
q.head.next=p.next
p.next=nil
q.length--
return true
}
func(q LinkQ)Show()string{
if q.length==0{
return "表是空的"
}
p:=q.head.next
for i:=0;i<q.length;i++{
fmt.Printf("%v",p.data)
p=p.next
}
return "打印完毕"
}
func main() {
**//初始化队列,注意这里q应该只是LinkQ类型**
q:=InitQ()
//往队列里插入数据
for i:=0;i<7;i++{
n:=InitQnode(i)
** //居然可以调用AddQ并且生效了**
q.AddQ(n)
}
fmt.Println(q.Show())
q.DelQ()
q.DelQ()
q.DelQ()
fmt.Println(q.Show())
}
结果:
0123456打印完毕
3456打印完毕