1.链表
(1) 头部插入法
//实现链表结构
package main
import (
"fmt"
"math/rand"
)
type Student struct {
Name string
age int
score int
//指向下一个结构体的指针地址
next *Student
}
func main () {
var head Student
head.Name = "zhangsan"
head.age = 18
head.score = 99
//2. 头部插入法
tail := &head
for i := 0; i < 10; i++ {
stu := Student {
Name: fmt.Sprintf("stu%d", i),
age:rand.Intn(30),
score:rand.Intn(100),
}
//fmt.Println(stu)
stu.next = tail
tail = &stu
}
//遍历移动链表元素
trans(tail)
}
//struct 是值类型,要想改变其值,只有传递指针
func trans (p *Student) {
for {
if p != nil {
fmt.Println(*p)
p = (*p).next
}
}
}
(2) 尾部插入法
//实现链表结构
package main
import (
"fmt"
"math/rand"
)
type Student struct {
Name string
age int
score int
//指向下一个结构体的指针地址
next *Student
}
func main () {
var head Student
head.Name = "zhangsan"
head.age = 18
head.score = 99
//1.尾部插入节点,尾部插入法
tail := &head
//生成新的Student
for i := 0; i < 10; i++ {
stu := &Student {
Name:fmt.Sprintf("%s%d", "stu", i),
age:rand.Intn(30),
score:rand.Intn(100),
}
tail.next = stu
tail = stu
}
//遍历移动链表元素
trans(tail)
}
//struct 是值类型,要想改变其值,只有传递指针
func trans (p *Student) {
for {
if p != nil {
fmt.Println(*p)
p = (*p).next
}
}
}
2.二叉树
//二叉树
package main
import "fmt"
type demotree struct {
name string
//指向左子树的指针
left *demotree
//指向右子树的指针
right *demotree
}
//遍历二叉树
func trans (d *demotree) {
//前序遍历
fmt.Println(d)
if d.left != nil {
trans(d.left)
}
if d.right != nil {
trans(d.right)
}
}
func main () {
var root demotree
root.name = "a"
var left demotree
left.name = "b"
root.left = &left
var right demotree
right.name = "c"
root.right = &right
var left2 demotree
left2.name = "d"
left.left = &left2
trans(&root)
}