有一个任务需要用到Go的单向链表,我查了一下没有找到合适的,所以自己写了一个。
我先说一下我的情况,我需要把菜单分级排序,也就是第一级下面紧跟着自己的子菜单。
首先先把菜单的所有项按照Id和Level数序拍好,也就是一级的都放在最上面,紧接着跟着2级的,2级的下面是3级的,以此类推。
先看一下数据结构
type SunnyNavigation struct {
Id int
Level int
ParentId int
Name string
}
下面是我写的类,用于插入节点、取得节点长度、取得第一个节点,取得最后一个节点。
首先看一下节点的结构
type Node struct {
Data SunnyNavigation
Next *Node
}
具体代码如下:
package singlechain
import (
"fmt"
)
type SunnyNavigation struct {
Id int
Level int
ParentId int
Name string
}
//节点结构
type Node struct {
Data SunnyNavigation
Next *Node
}
var Chain Node
/*
* 返回第一个节点
* h 头结点
*/
func GetFirst() *Node {
h := &Chain
if h.Next == nil {
return nil
}
return h.Next
}
/*
* 返回最后一个节点
* h 头结点
*/
func GetLast() *Node {
h := &Chain
if h.Next == nil {
return nil
}
i := h
for i.Next != nil {
i = i.Next
if i.Next == nil {
return i
}
}
return nil
}
//取长度
func GetLength() int {
var i int = 0
n := &Chain
for n.Next != nil {
if n.Data.Name != "" {
fmt.Println("^^^^^^^^", n.Data.Id, n.Data.Level, n.Data.ParentId, n.Data.Name)
}
i++
n = n.Next
}
if n.Data.Name != "" {
fmt.Println("^^^^^^^^", n.Data.Id, n.Data.Level, n.Data.ParentId, n.Data.Name)
}
return i
}
//插入一个节点
//h: 头结点
//d:要插入的节点
//p:要插入的位置
func Insert(p SunnyNavigation) (result bool) {
node := &Chain
if node.Next == nil && GetLength() == 0 {
var mynode Node
mynode.Data = p
mynode.Next = nil
node.Next = &mynode
result = true
} else {
result = false
for node.Next != nil {
if node.Data.Id == p.ParentId {
// fmt.Println("---------", p, node.Data.ParentId, node.Data.Name)
var mynode Node
mynode.Data = p
mynode.Next = node.Next
node.Next = &mynode
result = true
break
}
node = node.Next
if node.Next == nil {
var mynode Node
mynode.Data = p
mynode.Next = nil
node.Next = &mynode
result = true
break
}
}
}
return
}
调用的情况
package main
import (
"fmt"
"./singlechain/"
)
func main() {
var snArray []singlechain.SunnyNavigation
sn := singlechain.SunnyNavigation{1, 0, 0, "新闻管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{52, 0, 0, "推荐新闻管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{55, 0, 0, "频道管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{57, 0, 0, "广告&友链管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{49, 0, 0, "幻灯"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{44, 0, 0, "系统管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{2, 1, 1, "新闻添加"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{3, 1, 1, "新闻列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{45, 1, 44, "用户管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{46, 1, 44, "用户组管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{47, 1, 44, "权限管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{48, 1, 44, "菜单管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{51, 1, 49, "幻灯管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{53, 1, 52, "推荐新闻列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{54, 1, 52, "推荐分类列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{56, 1, 55, "频道管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{60, 1, 55, "城市信息管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{58, 1, 57, "广告列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{59, 1, 57, "友链的管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{222, 1, 3, "新闻333"}
snArray = append(snArray, sn)
// fmt.Println(snArray)
for _, sn := range snArray {
singlechain.Insert(sn)
}
fmt.Println("length---------", singlechain.GetLength())
d := singlechain.GetFirst()
fmt.Println(d.Data.Name)
d = singlechain.GetLast()
fmt.Println(d.Data.Name)
}
不过我做的这个插入有一个问题,不过我是百思不得其解:就是我平级插入的节点不知道为什么,后面的反而插到前面去了。
^^^^^^^^ 52 0 0 推荐新闻管理
^^^^^^^^ 54 1 52 推荐分类列表
^^^^^^^^ 53 1 52 推荐新闻列表
^^^^^^^^ 1 0 0 新闻管理
^^^^^^^^ 3 1 1 新闻列表
^^^^^^^^ 222 1 3 新闻333
^^^^^^^^ 2 1 1 新闻添加
如果有谁能够告诉我,我万分感激