Go编写的Linktable库

Frankfurtlin 2022-04-04 09:19:42

参考c语言实现的Linktable库

链表及链表节点定义

//定义节点
type LinkTableNode struct {
    pNext *LinkTableNode
}

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

创建linktable代码实现

//创建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
}

删除linktable代码实现

//删除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
}

添加节点

//添加节点
func AddLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
    if pLinkTable == nil || pNode == nil {
        return FAILURE
    }
    pLinkTable.mutex.Lock()
    if pLinkTable.pHead == nil && pLinkTable.pTail == nil {
        pLinkTable.pHead = pNode
        pLinkTable.pTail = pNode
        pLinkTable.pTail.pNext = nil
        pLinkTable.SumOfNode = 1
    } else {
        pLinkTable.pTail.pNext = pNode
        pLinkTable.pTail = pNode
        pLinkTable.pTail.pNext = nil
        pLinkTable.SumOfNode++
    }
    pLinkTable.mutex.Unlock()
    return SUCCESS
}

删除节点

//删除节点
func DelLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
    if pLinkTable == nil || pNode == nil {
        return FAILURE
    }
    pLinkTable.mutex.Lock()
    var pWork *LinkTableNode = pLinkTable.pHead
    var pre *LinkTableNode = pWork
    if pLinkTable.pHead == pNode {
        pLinkTable.pHead = pWork.pNext
        pLinkTable.SumOfNode--
        return SUCCESS
    }
    for pWork != nil {
        if pWork == pNode {
            pre.pNext = pWork.pNext
            pLinkTable.SumOfNode--
            return SUCCESS
        }
        pre = pWork
        pWork = pWork.pNext
    }
    return FAILURE
}

查询节点

//查询节点
func SearchLinkTableNode(pLinkTable *LinkTable, Condition func(pNode *LinkTableNode, args unsafe.Pointer) int, args unsafe.Pointer) *LinkTableNode {
    if pLinkTable == nil || Condition == nil {
        return nil
    }
    var pNode *LinkTableNode = pLinkTable.pHead
    for pNode != nil {
        if Condition(pNode, args) == SUCCESS {
            return pNode
        }
        pNode = pNode.pNext
    }
    return nil
}

获取头节点

//获取LinkTable头节点
func getLinkTableHead(pLinkTable *LinkTable) *LinkTableNode {
    if pLinkTable == nil {
        fmt.Println("LinkTable is empty")
        return nil
    }
    return pLinkTable.pHead
}

获取下一个节点

//获取下一个节点
func getNextLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) *LinkTableNode {
    if pLinkTable == nil || pNode == nil {
        fmt.Println("Linktable is empty")
        return nil
    }
    var pWork *LinkTableNode = pLinkTable.pHead
    for pWork != nil {
        if pWork == pNode {
            return pWork.pNext
        }
        pWork = pWork.pNext
    }
    return nil
}

代码版本库链接

frankfurtlin-302

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

    571

    社区成员

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

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