使用Go语言编写Link Table库

phantom_of_shadow 2022-04-06 18:12:04

使用Go语言编写一个Linktable的库并分享定义接口和设计一个程序库的心得体会,将代码上传至GitHub

代码参考Lab4

编写LinkTable

定义结点和链表

/*
 * Define LinkTable Node
 */
type LinkTableNode struct {
    pNext *LinkTableNode
}

/*
 * Define LinkTable
 */
type LinkTable struct {
    pHead     *LinkTableNode
    pTail     *LinkTableNode
    SumOfNode int
    mutex     sync.Mutex
}

定义LinkTable的创建与删除操作

/*
 * Create a LinkTable
 */
func CreateLinkTable() *LinkTable {
    var pLinkTable *LinkTable = new(LinkTable)
    if pLinkTable == nil {
        return nil
    }
    pLinkTable.pHead = nil
    pLinkTable.pTail = nil
    pLinkTable.SumOfNode = 0
    return pLinkTable
}

/*
 * Delete a LinkTable
 */
func DeleteLinkTable(pLinkTable *LinkTable) int {
    if pLinkTable == nil {
        return FAILURE
    }
    for pLinkTable.pHead != nil {
        var p *LinkTableNode = pLinkTable.pHead
        pLinkTable.mutex.Lock()
        pLinkTable.pHead = p.pNext
        pLinkTable.SumOfNode--
        pLinkTable.mutex.Unlock()
    }
    pLinkTable.pHead = nil
    pLinkTable.pTail = nil
    pLinkTable.SumOfNode = 0
    return SUCCESS
}

定义LinkTable中结点的插入和删除操作

/*
 * Add a LinkTableNode to LinkTable
 */
func AddLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
    if pLinkTable == nil || pNode == nil {
        return FAILURE
    }
    pNode.pNext = nil
    pLinkTable.mutex.Lock()
    if pLinkTable.pHead == nil {
        pLinkTable.pHead = pNode
    }
    if pLinkTable.pTail == nil {
        pLinkTable.pTail = pNode
    } else {
        pLinkTable.pTail.pNext = pNode
        pLinkTable.pTail = pNode
    }
    pLinkTable.SumOfNode++
    pLinkTable.mutex.Unlock()
    return SUCCESS
}

/*
 * Delete a LinkTableNode from LinkTable
 */
func DelLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
    if pLinkTable == nil || pNode == nil {
        return FAILURE
    }
    pLinkTable.mutex.Lock()
    if pLinkTable.pHead == pNode {
        pLinkTable.pHead = pLinkTable.pHead.pNext
        pLinkTable.SumOfNode--
        if pLinkTable.SumOfNode == 0 {
            pLinkTable.pTail = nil
        }
        pLinkTable.mutex.Unlock()
        return SUCCESS
    }
    var pTempNode *LinkTableNode = pLinkTable.pHead
    for pTempNode != nil {
        if pTempNode.pNext == pNode {
            pTempNode.pNext = pTempNode.pNext.pNext
            pLinkTable.SumOfNode--
            if pLinkTable.SumOfNode == 0 {
                pLinkTable.pTail = nil
            }
            pLinkTable.mutex.Unlock()
            return SUCCESS
        }
        pTempNode = pTempNode.pNext
    }
    pLinkTable.mutex.Unlock()
    return FAILURE
}

定义LinkTable的基础查找操作

/*
 * get LinkTableHead
 */
func GetLinkTableHead(pLinkTable *LinkTable) *LinkTableNode {
    if pLinkTable == nil {
        fmt.Println("LinkTable is empty")
        return nil
    }
    return pLinkTable.pHead
}

/*
 * get next LinkTableNode
 */
func GetNextLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) *LinkTableNode {
    if pLinkTable == nil || pNode == nil {
        fmt.Println("Linktable is empty")
        return nil
    }
    var pTempNode *LinkTableNode = pLinkTable.pHead
    for pTempNode != nil {
        if pTempNode == pNode {
            return pTempNode.pNext
        }
        pTempNode = pTempNode.pNext
    }
    return nil
}

menu的命令修改下次一定,库的接口设计尽量与业务逻辑独立,从而提高程序的复用性

在GitHub上更新代码

代码地址

git add linktable.go
git commit -m "add basic link table interface"
git push

github

作者:406

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

571

社区成员

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

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