Golang 编写 LinkTable 库

qq_41133685 2022-04-06 10:21:19

一、定义 LinkTableNode 和 LinkTable

type LinkTableNode struct {
    Val   int
    PNext *LinkTableNode
}

type LinkTable struct {
    pHead, pTail *LinkTableNode
    sumOfNode    int
    mutex        *sync.Mutex
}

二、定义 LinkTable 相关方法

1、CreateLinkTable
func CreateLinkTable() *LinkTable {
    return &LinkTable{
        pHead:     nil,
        pTail:     nil,
        sumOfNode: 0,
        mutex:     &sync.Mutex{},
    }
}
2、DeleteLinkTable
func (lt *LinkTable) DeleteLinkTable() bool {
    if lt == nil {
        return false
    }
    lt.pHead, lt.pTail = nil, nil
    lt.sumOfNode = 0
    return true
}
3、AddLinkTableNode
func (lt *LinkTable) AddLinkTableNode(pNode *LinkTableNode) bool {
    if lt == nil || pNode == nil {
        return false
    }
    pNode.PNext = nil
    lt.mutex.Lock()
    if lt.pHead == nil {
        lt.pHead, lt.pTail = pNode, pNode
    } else {
        lt.pTail.PNext = pNode
        lt.pTail = pNode
    }
    lt.sumOfNode++
    lt.mutex.Unlock()
    return true
}
4、DelLinkTableNode
func (lt *LinkTable) DelLinkTableNode(pNode *LinkTableNode) bool {
    if lt == nil || pNode == nil {
        return false
    }
    lt.mutex.Lock()
    if lt.pHead == pNode {
        lt.pHead = lt.pHead.PNext
        lt.sumOfNode--
        if lt.sumOfNode == 0 {
            lt.pTail = nil
        }
        lt.mutex.Unlock()
        return true
    }
    pTempNode := lt.pHead
    for pTempNode != nil {
        if pTempNode.PNext == pNode {
            if lt.pTail == pNode {
                lt.pTail = pTempNode
            }
            pTempNode.PNext = pTempNode.PNext.PNext
            lt.sumOfNode--
            lt.mutex.Unlock()
            return true
        }
        pTempNode = pTempNode.PNext
    }
    lt.mutex.Unlock()
    return false
}
5、SearchLinkTableNode
func (lt *LinkTable) SearchLinkTableNode(Condition func(*LinkTableNode) bool) *LinkTableNode {
    if lt == nil || Condition == nil {
        return nil
    }
    pNode := lt.pHead
    for pNode != nil {
        if Condition(pNode) {
            return pNode
        }
        pNode = pNode.PNext
    }
    return nil
}
6、GetLinkTableHead
func (lt *LinkTable) GetLinkTableHead() *LinkTableNode {
    if lt == nil {
        return nil
    }
    return lt.pHead
}
7、GetNextLinkTableNode
func (lt *LinkTable) GetNextLinkTableNode(pNode *LinkTableNode) *LinkTableNode {
    if lt == nil || pNode == nil {
        return nil
    }
    pTempNode := lt.pHead
    for pTempNode != nil {
        if pTempNode == pNode {
            return pTempNode.PNext
        }
        pTempNode = pTempNode.PNext
    }
    return nil
}
8、实现Stringer()接口(fmt标准输出)
func (lt *LinkTable) String() string {
    if lt == nil || lt.pHead == nil {
        return "linkTable is null"
    }
    pNode := lt.pHead
    res := &strings.Builder{}
    for pNode != nil {
        res.WriteString(strconv.Itoa(pNode.Val))
        res.WriteString(" ")
        pNode = pNode.PNext
    }
    return res.String()
}

三、使用 testing 进行单元测试

//LinkTable_test.go
package linktable

import (
    "fmt"
    "testing"
)

func TestLinkTable(t *testing.T) {
    lt := CreateLinkTable()
    one := &LinkTableNode{1, nil}
    two := &LinkTableNode{2, nil}
    three := &LinkTableNode{3, nil}
    four := &LinkTableNode{4, nil}
    lt.AddLinkTableNode(one)
    lt.AddLinkTableNode(two)
    lt.AddLinkTableNode(three)
    lt.AddLinkTableNode(four)
    fmt.Println("当前链表:", lt)        // 1 2 3 4
    fmt.Println("链表头部:", lt.GetLinkTableHead())    //1
    lt.DelLinkTableNode(three)    // 1 2 4
    lt.DelLinkTableNode(four)    // 1 2
    fmt.Println("one节点的后继节点:", lt.GetNextLinkTableNode(one))    // 2 
    fmt.Println("查询val为1的节点:", lt.SearchLinkTableNode(func(ltn *LinkTableNode) bool {
        return ltn.Val == 1
    }))        // 1
    lt.DeleteLinkTable()
    fmt.Println(lt)        //LinkTable is null
}

四、代码版本库

代码版本库地址

img

作者:426

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

571

社区成员

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

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