使用Go编写LinkTable库

WendyJane 2022-04-07 23:31:08

1.定义结点及链表结构

//定义链表结点
type LinkNode struct{
    data interface{}
    next *LinkNode
}

//定义链表
type LinkTable struct{
    length int
    head *LinkNode
    tail *LinkNode
}

2.初始化结点及链表

//初始化LinkNode
func InitLinkNode(data interface{}) *LinkNode{
    return &LinkNode{
        data : data,
        next : nil,
    }
}

//初始化LinkTable
func  InitLinkTable() *LinkTable{
    return  &LinkTable{
        length : 0,
        head :  nil,
        tail :  nil,
    }
}

3.链表操作

//判断链表是否为空
func IsEmpty(pLink *LinkTable) bool{
    return pLink.length == 0
}

//链表头部添加结点
func AddToHead(pLink *LinkTable, node *LinkNode) bool {
    if pLink == nil || node == nil {
        return false
    }
    if IsEmpty(pLink) {    
        pLink.tail = node
    } else {
        node.next = pLink.head
    }
    pLink.head = node
    pLink.length ++
    return true
}

//链表尾部添加结点
func AddToTail(pLink *LinkTable, node *LinkNode) bool {
    if pLink == nil || node == nil {
        return false
    }
    if IsEmpty(pLink) {
        pLink.head = node    
    } else {
        pLink.tail.next = node
    }
    pLink.tail = node
    pLink.length ++
    return true
}

//删除对应值的第一个出现的结点
func DeleteFirstValueNode(pLink *LinkTable, data interface{}) bool {
    if pLink == nil {
        return false
    }
    if pLink.head.data == data{    
        if pLink.length == 1 {
            pLink.head = nil
            pLink.tail = nil
        } else {
            pLink.head = pLink.head.next
        }
        pLink.length--
        return true
    }
    var p *LinkNode = pLink.head
    for p != pLink.tail {
        if p.next.data == data {
            p.next = p.next.next
            pLink.length--
            if p.next == nil{
                pLink.tail = p
            }
            return true
        }
        p = p.next
    }
    return false
}

//查找对应值的结点
func SelectLinkNode(pLink *LinkTable, data interface{}) *LinkNode {
    if pLink == nil {
        return nil
    }
    var p *LinkNode = pLink.head
    for p != nil {
        if p.data == data {
            return p
        }
        p = p.next
    }
    return nil
}

//对链表遍历,并显示结点对应值
func ShowLinkTableValues(pLink *LinkTable) {
    var p *LinkNode = pLink.head
    if p == nil{
        fmt.Println("length=",pLink.length, " 链表为空")
        return
    }
    fmt.Print("length=",pLink.length, " ")
    for p != nil {
        fmt.Print(p.data," ")
        p = p.next
    }
    fmt.Println()
}

4.测试

func main() {
    pLinkTable := InitLinkTable()
    ShowLinkTableValues(pLinkTable)
    node1 := InitLinkNode("abc")
    AddToHead(pLinkTable, node1)
    AddToHead(pLinkTable, InitLinkNode("1"))
    AddToTail(pLinkTable, InitLinkNode("3lo"))
    AddToTail(pLinkTable, InitLinkNode("2022"))
    AddToHead(pLinkTable, InitLinkNode("xyz"))
    ShowLinkTableValues(pLinkTable)

    DeleteFirstValueNode(pLinkTable,"2")
    DeleteFirstValueNode(pLinkTable,"1")
    ShowLinkTableValues(pLinkTable)

    fmt.Println("查找值为2020的结点:",SelectLinkNode(pLinkTable,"2020"))
    fmt.Println("查找值为xyz的结点:",SelectLinkNode(pLinkTable,"xyz"))
    fmt.Println("查找值为2022的结点:",SelectLinkNode(pLinkTable,"2022"))
    DeleteFirstValueNode(pLinkTable,"xyz")
    DeleteFirstValueNode(pLinkTable,"2022")
    ShowLinkTableValues(pLinkTable)
}

5.测试结果

img

6.同步代码到仓库

img

仓库地址

237

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

571

社区成员

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

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