GO-重点操作:结构体链表

本文介绍了Go语言中的结构体,强调其作为值类型和可以定义方法的特点,并探讨了结构体链表的存储方式和更新方法。通过示例展示了值类型存储地址的连续性以及链表中节点的添加、删除和修改操作。
摘要由CSDN通过智能技术生成

目录

1,存储方式

2,链表更新


概念:结构体是自定义复杂数据结构,struc里面可以包含多个字段(属性) , struct类型可以定义方法,和函数有区分,struct属于值类型,且可以做嵌套,Go中没有Class类型, 只有struct类型。 示例:结构体定义

package main
​
import "fmt"
​
//结构体定义
type student struct {
    name  string
    age   int
    score float32
    next  *student //指向自己就是链表结构
}
​
// type student struct {
//  name  string
//  age   int
//  score float32
//  next  person //嵌套机构体
// }
// type person struct {
// }
​
func main() {
    //实体
    //var head student   //第一种定义方式
    //var head *student = new(student) //第二种定义方式
    var head *student = &student{} //第三种定义方式
    head.name = "head"
    head.age = 20
    head.score = 80
    //实体2
​
    var stu1 student
    stu1.name = "name"
    stu1.age = 21
    stu1.score = 50
    //指针指向实体2
    head.next = &stu1
​
    //输出调用
    fmt.Println(head)
    fmt.Println((*head).name)
    fmt.Println(head.name)
}
​
​
[Running] go run "f:\goProject\src\dev_code\day17\example1\amin\main.go"
&{head 20 80 0xc0001104b0}
head
head
​
[Done] exited with code=0 in 0.488 seconds

struc定义的三种形式:其中2和3都是返回结构体的指针。

1: var stu Student
2: var stu *Student = new (Stydent)
3: var stu *Student = &Student {}
调用:
stu. Name、stu.Age、 stu. Score
或者
(*stu) .Name、 (*stu).Age、 ( *stu).Score

1,存储方式

示例:值类型存储方式地址空间连续。

package main
​
import "fmt"
​
//结构体定义
type student struct {
    name  string
    age   int
    score float32
    next  *student //指向自己就是链表结构
}
​
func main() {
    //实体
    //var head student   //第一种定义方式
    //var head *student = new(student) //第二种定义方式
    var head *student = &student{} //第三种定义方式
    head.name = "head"
    head.age = 20
    head.score = 80
​
    fmt.Printf("name:%p\n", &head.name)
    fmt.Printf("age:%p\n", &head.age)
    fmt.Printf("score:%p\n", &head.score)
}
[Running] go run "f:\goProject\src\dev_code\day17\example2\main\main.go"
name:0xc0000c2450   //结构体内属性的存储地址都是连续的
age:0xc0000c2460
score:0xc0000c2468
​
[Done] exited with code=0 in 0.647 seconds

2,链表更新

示例:链表方式串联结构体。链表:大小不固定,地址不连续,长度不同定,链表中第一个元素称为头部, 最后一个元素指针指向nil. 链表分类为,单链表、双链表、循环单链表、循环双链表。

示例:

package main
​
import (
    "fmt"
    "math/rand"
)
​
//定义结构体
type student struct {
    name  string
    age   int
    score float32
    next  *student //存放下一个结构体的地址,用*指就是下一个结构体
}
​
func main() {
    //定义头部结构体
    var head student
    head.name = "head"
    head.age = 20
    head.score = 90
    //定义第二个结构体
    var stu1 student
    stu1.name = "stu1"
    stu1.age = 21
    stu1.score = 91
    //串联两个结构体
    //head.next = &stu1
    //第三个结构体
    var stu2 student
    stu2.name = "stu2"
    stu2.age = 22
    stu2.score = 95
    //串联第三第二个结构体
    stu1.next = &stu2
    //第四个结构体
    var stu3 student
    stu3.name = "stu3"
    stu3.age = 23
    stu3.score = 96
    //串联第四第三个结构体
    stu2.next = &stu3
​
    inserthead(&head)
    //在头部插入
    // var tmp3 = new(student)
​
    // for i := 20; i < 25; i++ {
    //  var stu student = student{
    //      name:  fmt.Sprin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值