使用go实现Linktable

qq_40658591 2022-04-04 16:30:53

一、Linktable的实现

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
}

menu.go

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()
        }
    }
 
}

二、运行结果

img


gitee库:https://gitee.com/chongzi/menu

学号 403

...全文
84 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧