571
社区成员
发帖
与我相关
我的任务
分享package test
type LinkTableNode struct {
PNext *LinkTableNode
}
type LinkTable struct {
PHead *LinkTableNode
PTail *LinkTableNode
SumOfNode int
}
/* 创建链表 */
func CreateLinkTable() *LinkTable {
return nil
}
/* 删除链表 */
func DeleteLinkTable(linktable *LinkTable) int {
return -1
}
/* 增加一个链表节点到链表上 */
func AddLinkTableNode(linktable *LinkTable, node *LinkTableNode) bool {
if linktable == nil {
return false
}
linktable.SumOfNode++
if linktable.PHead == nil {
linktable.PHead = node
}
if linktable.PTail == nil {
linktable.PTail = node
} else {
linktable.PTail.PNext = node
linktable.PTail = node
}
return true
}
/* 从链表上删除一个链表节点 */
func DeleteLinkTableNode(linkTable *LinkTable, node *LinkTableNode) bool {
if linkTable == nil || node == nil {
return false
}
linkTable.SumOfNode--
if node == linkTable.PHead {
linkTable.PHead = linkTable.PHead.PNext
return true
}
tmp := linkTable.PHead
for tmp.PNext != nil {
if tmp.PNext == node {
if node == linkTable.PTail && tmp.PNext == linkTable.PTail {
linkTable.PTail = tmp
linkTable.PTail = nil
return true
}
tmp.PNext = tmp.PNext.PNext
return true
}
tmp = tmp.PNext
}
return false
}
/* 得到链表的头结点 */
func GetLinkTableHead(linktable *LinkTable) *LinkTableNode {
return linktable.PHead
}
/* 得到当前节点的下一个节点 */
func GetNextLinkTableNode(linktable *LinkTable, node *LinkTableNode) *LinkTableNode {
if node == nil {
return nil
}
tmp := linktable.PHead
for tmp != nil {
if tmp == node {
return tmp.PNext
}
tmp = tmp.PNext
}
return nil
}
package main
import (
"fmt"
lNode "module/test"
"os"
"strings"
"unsafe"
)
type DataNode struct {
head lNode.LinkTableNode
cmd string
desc string
handler func()
}
var linkTable *lNode.LinkTable
func InitMenuData() {
p := &DataNode{cmd: "help", desc: "this is help", handler: help}
lNode.AddLinkTableNode(linkTable, (*lNode.LinkTableNode)(unsafe.Pointer(p)))
p = &DataNode{cmd: "version", desc: "menu version 4.0", handler: nil}
lNode.AddLinkTableNode(linkTable, (*lNode.LinkTableNode)(unsafe.Pointer(p)))
p = &DataNode{cmd: "quit", desc: "close this program", handler: quit}
lNode.AddLinkTableNode(linkTable, (*lNode.LinkTableNode)(unsafe.Pointer(p)))
}
func help() {
p := (*DataNode)(unsafe.Pointer(lNode.GetLinkTableHead(linkTable)))
for p != nil {
fmt.Printf("%s----%s", p.cmd, p.desc)
fmt.Println()
p = (*DataNode)(unsafe.Pointer(lNode.GetNextLinkTableNode(linkTable, (*lNode.LinkTableNode)(unsafe.Pointer(p)))))
}
}
func quit() {
os.Exit(0)
}
func findCmd(cmd string) *DataNode {
p := (*DataNode)(unsafe.Pointer(lNode.GetLinkTableHead(linkTable)))
if p == nil {
return nil
}
for p != nil {
if strings.Compare(p.cmd, cmd) == 0 {
return p
}
p = (*DataNode)(unsafe.Pointer(lNode.GetNextLinkTableNode(linkTable, (*lNode.LinkTableNode)(unsafe.Pointer(p)))))
}
return nil
}
func main() {
linkTable = &lNode.LinkTable{PHead: nil, PTail: nil, SumOfNode: 0}
InitMenuData()
fmt.Println("Please input a command:")
var command string
for true {
//获取用户输入
fmt.Scanln(&command)
p := findCmd(command)
if p == nil {
fmt.Println("Wrong command")
continue
}
fmt.Printf("%s-----%s", p.cmd, p.desc)
fmt.Println()
if p.handler != nil {
p.handler()
}
}
}
