golang基础-结构体、结构体链表前后插入、节点添加删除
2017-10-26 21:58
567 查看
结构体定义
struct用来自定义复杂数据结构
struct里面可以包含多个字段(属性)
struct类型可以定义方法,注意和函数的区分
struct类型是值类型
struct类型可以嵌套
Go语言没有class类型,只有struct类型
package main import ( "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} 18 0xc042002750 &{aaa 18 100} --------------- &{hh 20 0} 20 {hh 20 0} 0xc042002850 0xc042004030 ----------- {iii 18 0} &{iii 18 0} 18 0xc042002950 PS E:\golang\go_pro\src\safly>
结构体链表定义
链表定义
type Student struct { Name string Next* Student }
每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把
链表中的第一个节点叫做链表头
我们来看一个例子,就是在结构体,末尾插入一个节点
[b]尾部插入[/b]
package main import ( "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>
以上是在末尾插入 ,我们接下来看在头部插入节点的代码
[b]头部插入[/b]
头部插入的第一种方法:
package main import ( "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 main import ( "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 main import ( "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 main import ( "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 main import ( "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>
相关文章推荐
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- 双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)
- c++基础之插入和删除链表节点
- 链表:创建、清空、插入、添加、删除节点
- Partition List(链表的插入和删除操作,找前驱节点)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 【郝斌数据结构自学笔记】16-23_链表的定义与分类_链表节点插入与删除_每一个链表节点的数据类型该如何表示的问题
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C++中链表的创建、输出、节点删除、节点插入、翻转、清空
- 双向链表 删除节点 插入节点
- 13.3 链表-按顺序插入和查找删除节点
- 数据结构——2 单链表插入和删除节点
- 数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点
- 数据结构---单链表(建立,节点删除,节点插入)
- 很简单的数据结构:链表线性存储的创建、取数据、数据添加、数据插入、数据删除
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 判断链表是否为空、求链表长度、插入新节点、删除节点、链表排序
- 《编程之美》3.4 从无头单链表中删除/添加节点
- 创建一个链表、删除一个节点、插入一个节点--实验