Go做复杂的单向链表

有一个任务需要用到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 新闻添加

如果有谁能够告诉我,我万分感激

转载于:https://my.oschina.net/jinheking/blog/713914

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值