golang基础-结构体、结构体链表前后插入、节点添加删除
来源:互联网 发布:上海雨人软件 编辑:程序博客网 时间:2024/05/29 03:07
结构体定义
struct
用来自定义复杂数据结构
struct里面可以包含多个字段(属性)
struct类型可以定义方法,注意和函数的区分
struct类型是值类型
struct类型可以嵌套
Go语言没有class类型,只有struct类型
package mainimport ( "fmt")type Student struct{ Name string Age int score float32}func main() { var stu Student stu.Age = 18 stu.Name = "aaa" stu.score = 100 //{aaa 18 100}格式 fmt.Println(stu) fmt.Println(stu.Age) fmt.Println(&stu.Age) fmt.Println(&stu) fmt.Println("---------------") var stu1 *Student = &Student{ Age : 20, Name:"hh", } fmt.Println(stu1) fmt.Println(stu1.Age) fmt.Println(*stu1) //如下的形式是不行 // fmt.Println(*stu1.Age) fmt.Println(&stu1.Age) fmt.Println(&stu1) fmt.Println("-----------") var stu3 = Student{ Age:18, Name:"iii", } fmt.Println(stu3) fmt.Println(&stu3) fmt.Println(stu3.Age) fmt.Println(&stu3.Age)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{aaa 18 100}180xc042002750&{aaa 18 100}---------------&{hh 20 0}20{hh 20 0}0xc0420028500xc042004030-----------{iii 18 0}&{iii 18 0}180xc042002950PS E:\golang\go_pro\src\safly>
结构体链表定义
链表定义
type Student struct { Name string Next* Student}
每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把
链表中的第一个节点叫做链表头
我们来看一个例子,就是在结构体,末尾插入一个节点
尾部插入
package mainimport ( "fmt")type Student struct{ Name string Age int score float32 next *Student}func main() { //创建一个头结点 var head Student head.Name = "safly" head.Age = 1 head.score = 100 //创建一个节点 var stu1 Student stu1.Name = "safly1" stu1.Age = 2 stu1.score = 101 head.next = &stu1 //创建一个临时遍历 var temp *Student = &head for temp!= nil{ fmt.Println(temp) temp = temp.next }}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go&{safly 1 100 0xc04203df80}&{safly1 2 101 <nil>}PS E:\golang\go_pro\src\safly>
以上是在末尾插入 ,我们接下来看在头部插入节点的代码
头部插入
头部插入的第一种方法:
package mainimport ( "fmt" "math/rand")type Student struct{ Name string Age int Score float32 next *Student}func main() { //创建一个头 var head *Student = &Student{} //或者如下的方式 // var head1 *Student = new(Student) head.Name = "safly" head.Age = 1 head.Score = 100 for i:=0;i<5;i++{ stu:= Student{ Name:fmt.Sprint(rand.Intn(100)), Age:rand.Intn(100), Score:rand.Float32()*100, } stu.next = head head = &stu } //循环输出 for head!=nil{ fmt.Println(*head) head = head.next }}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{62 89 31.805817 0xc042062060}{0 94 81.36399 0xc042062030}{25 40 9.696952 0xc042062000}{59 81 68.682304 0xc04203dfb0}{81 87 66.45601 0xc04203df80}{safly 1 100 <nil>}PS E:\golang\go_pro\src\safly>
我们将上面的代码进行优化:
package mainimport ( "fmt" "math/rand")type Student struct{ Name string Age int Score float32 next *Student}func main() { //创建一个头结点 var head *Student = new(Student) //或者如下的方式 // var head1 *Student = new(Student) head.Name = "safly" head.Age = 1 head.Score = 100 inserHead(&head) trans(head)}/**/func inserHead(p **Student){ // var tail = p for i:=0;i<5;i++{ stu:= Student{ Name:fmt.Sprint(rand.Intn(100)), Age:rand.Intn(100), Score:rand.Float32()*100, } stu.next = *p *p = &stu }}func trans(p *Student) { for p != nil { fmt.Println(*p) p = p.next } fmt.Println()}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{62 89 31.805817 0xc04204a2d0}{0 94 81.36399 0xc04204a2a0}{25 40 9.696952 0xc04204a270}{59 81 68.682304 0xc04204a240}{81 87 66.45601 0xc04204a210}{safly 1 100 <nil>}PS E:\golang\go_pro\src\safly>
或者如下的方法也可以
package mainimport ( "fmt" "math/rand")type Student struct{ Name string Age int Score float32 next *Student}func main() { //创建一个头结点 var head *Student = new(Student) //或者如下的方式 // var head1 *Student = new(Student) head.Name = "safly" head.Age = 1 head.Score = 100 for i:=0;i<5;i++{ stu:= Student{ Name:fmt.Sprint(rand.Intn(100)), Age:rand.Intn(100), Score:rand.Float32()*100, } stu.next = *(&head) *(&head) = &stu } trans(head)}func trans(p *Student) { for p != nil { fmt.Println(*p) p = p.next } fmt.Println()}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{62 89 31.805817 0xc042062060}{0 94 81.36399 0xc042062030}{25 40 9.696952 0xc042062000}{59 81 68.682304 0xc04203dfb0}{81 87 66.45601 0xc04203df80}{safly 1 100 <nil>}PS E:\golang\go_pro\src\safly>
删除节点
package mainimport ( "fmt" "math/rand")type Student struct{ Name string Age int Score float32 next *Student}func main() { //创建一个头结点 var head *Student = new(Student) //或者如下的方式 // var head1 *Student = new(Student) head.Name = "safly" head.Age = 1 head.Score = 100 //添加节点 for i:=0;i<5;i++{ stu:= Student{ Name:fmt.Sprintf("stu%d",i), Age:rand.Intn(100), Score:rand.Float32()*100, } stu.next = *(&head) *(&head) = &stu } trans(head) //删除节点 delNode(head) trans(head)}/* 删除节点*/func delNode(p *Student) { var prev *Student = p for p != nil { if (*p).Name == "stu3" { prev.next = p.next break } //如果没有遍历到,往下延迟一个 prev = p p = p.next }}func trans(p *Student) { for p != nil { fmt.Println(*p) p = p.next } fmt.Println()}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{stu4 56 30.091187 0xc042062060}{stu3 25 15.651925 0xc042062030}{stu2 81 68.682304 0xc042062000}{stu1 47 43.77142 0xc04203dfb0}{stu0 81 94.05091 0xc04203df80}{safly 1 100 <nil>}{stu4 56 30.091187 0xc042062030}{stu2 81 68.682304 0xc042062000}{stu1 47 43.77142 0xc04203dfb0}{stu0 81 94.05091 0xc04203df80}{safly 1 100 <nil>}PS E:\golang\go_pro\src\safly>
添加节点
package mainimport ( "fmt" "math/rand")type Student struct{ Name string Age int Score float32 next *Student}func main() { //创建一个头结点 var head *Student = new(Student) //或者如下的方式 // var head1 *Student = new(Student) head.Name = "safly" head.Age = 1 head.Score = 100 //添加节点 for i:=0;i<5;i++{ stu:= Student{ Name:fmt.Sprintf("stu%d",i), Age:rand.Intn(100), Score:rand.Float32()*100, } stu.next = *(&head) *(&head) = &stu } trans(head) var newNode *Student = new(Student) newNode.Name = "stu1000" newNode.Age = 18 newNode.Score = 100 addNode(head, newNode) trans(head)}func addNode(p *Student, newNode *Student) { for p != nil { if p.Name == "stu2" { newNode.next = p.next p.next = newNode break } p = p.next } }func trans(p *Student) { for p != nil { fmt.Println(*p) p = p.next } fmt.Println()}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{stu4 56 30.091187 0xc04204a2d0}{stu3 25 15.651925 0xc04204a2a0}{stu2 81 68.682304 0xc04204a270}{stu1 47 43.77142 0xc04204a240}{stu0 81 94.05091 0xc04204a210}{safly 1 100 <nil>}{stu4 56 30.091187 0xc04204a2d0}{stu3 25 15.651925 0xc04204a2a0}{stu2 81 68.682304 0xc04204a480}{stu1000 18 100 0xc04204a270}{stu1 47 43.77142 0xc04204a240}{stu0 81 94.05091 0xc04204a210}{safly 1 100 <nil>}PS E:\golang\go_pro\src\safly>
阅读全文
0 0
- golang基础-结构体、结构体链表前后插入、节点添加删除
- golang初始化结构体
- Golang结构体分析
- 数据结构学习之路----------线性表顺序存储结构插入和删除节点平均移动次数
- 原 golang 结构体
- Golang json转结构体
- Golang结构体和指针
- Rust golang之结构体
- golang基础-结构体tag、匿名字段、结构体的方法(作用域)、继承、String()方法
- 添加、删除、插入和替换[文本节点]
- 队列的结构体,插入及删除(绝对正确)
- Java递归删除树形结构父节点
- golang基础-反射获取(基础数据、结构体)、操作(基本类型、结构体、指针)、反射获取Tag
- 顺序存储结构的插入与删除
- 顺序存储结构插入与删除
- 顺序存储结构的插入与删除
- 线性结构中的插入删除基本运算
- 顺序存储结构的插入与删除
- Priority Queues
- 中介者模式学习和思考
- HTML插入图片存储路径问题
- C++中友元及继承
- Docker的安装
- golang基础-结构体、结构体链表前后插入、节点添加删除
- codeforces 702A Maximum Increase
- SVN的使用总结
- 我的电路实践
- angular常见错误
- Ubuntu系统编写shell脚本程序一次安装多个软件包
- Java中获取完整的url
- Tensorflow学习笔记2
- 装系统时总是提示 保存分区表时出现错误(0000000001)函数不正确