1. 程式人生 > 其它 >實現連結串列定義、尾部插入節點、頭部插入節點

實現連結串列定義、尾部插入節點、頭部插入節點

連結串列定義

package main

import "fmt"

// Student 每個節點包含下一個節點的地址,這樣把所有的節點都串起來了,通常把連結串列中的第一個節點叫做連結串列頭
/*
type Student struct {
	Name string
	Next *Student
}
*/

// 定義一個簡單的連結串列
type Student struct {
	Name  string
	Age   uint8
	Score float32
	Next  *Student
}

func main() {
	// 定義一個頭節點
	var head Student
	head.Name = "zhang"
	head.Age = 18
	head.Score = 88.5

	var stu1 Student
	stu1.Name = "li"
	stu1.Age = 35
	stu1.Score = 60

	// 將兩個節點連線起來
	head.Next = &stu1

	var p *Student = &head  // 將p指向連結串列的頭部
	for p != nil {
		fmt.Println(*p)
		p = p.Next
	}

}

尾部插入節點

package main

import (
	"fmt"
	"math/rand"
)

// 每個節點都包含下一個節點的地址,這樣就把所有的節點都串起來了,通常我們把第一個節點叫做連結串列頭

// Student 定義一個連結串列結構
type Student struct {
	Name string
	Age int
	Score float32
	Next *Student
}

func trans(node *Student) {
	for node != nil {
		fmt.Println(*node)
		node = node.Next
	}
}

func main() {
	// 通常我們把第一個節點叫做連結串列頭
	var head Student
	head.Name = "zhang"
	head.Age = 18
	head.Score = 88.5

	// 尾部插入法
	var tail *Student = &head  // 因為是指標型別,所以可以修改它的Next值
	for i := 0; i < 10; i++{
		var stu = Student{
			Name: fmt.Sprintf("stu%d", i),
			Age: rand.Intn(100),
			Score: rand.Float32() * 100,
		}
		tail.Next = &stu  // 把尾部節點的下一個節點設定為新生成的節點
		tail = &stu  // 把新生成的節點賦值給尾部節點
	}

	// 輸出所有節點
	trans(&head)
}

/* 輸出結果
{zhang 18 88.5 0xc0000764b0}
{stu0 81 94.05091 0xc0000764e0}
{stu1 47 43.77142 0xc000076510}
{stu2 81 68.682304 0xc000076540}
{stu3 25 15.651925 0xc000076570}
{stu4 56 30.091187 0xc0000765a0}
{stu5 94 81.36399 0xc0000765d0}
{stu6 62 38.06572 0xc000076600}
{stu7 28 46.888985 0xc000076630}
{stu8 11 29.310184 0xc000076660}
{stu9 37 21.855305 <nil>}
*/

頭部插入節點

package main

import (
	"fmt"
	"math"
	"math/rand"
)

// 每個節點都包含下一個節點的地址,這樣所有的節點都串起來了,通常我們把第一個節點叫做連結串列頭

type Student struct {
	Name string
	Age int
	Score float64
	Next *Student
}

func trans(s *Student){
	for s != nil {
		fmt.Println(*s)
		s = s.Next
	}
}

func main() {
	var head *Student = new(Student)
	head.Name = "zhang"
	head.Age = 18
	head.Score = 88.5

	// 頭部插入法
	for i := 0; i < 10; i++{
		var stu = Student{
			Name: fmt.Sprintf("stu%d", i + 1),
			Age: rand.Intn(100),
			Score: math.Round(rand.Float64() * 100),
		}
		stu.Next = head
		head = &stu
	}

	trans(head)

}

/*
{stu10 37 22 0xc000076660}
{stu9 11 29 0xc000076630}
{stu8 28 47 0xc000076600}
{stu7 62 38 0xc0000765d0}
{stu6 94 81 0xc0000765a0}
{stu5 56 30 0xc000076570}
{stu4 25 16 0xc000076540}
{stu3 81 69 0xc000076510}
{stu2 47 44 0xc0000764e0}
{stu1 81 94 0xc0000764b0}
{zhang 18 88.5 <nil>}
*/