571
社区成员
发帖
与我相关
我的任务
分享定义链表库的通用接口,无需关心数据部分,只需完成链表最基本的功能。暴露给用户的功能有新建链表节点、新建链表、在链表中增加一个节点,删除一个节点。此外,链表的头尾节点指针和节点的下一个节点也提供给用户,方便用户结合数据部分进行查看与修改的操作。
1.定义链表节点和链表
//链表节点
type LinkNode struct {
NextNode *LinkNode
Data interface{} //为了方便拓展数据类型
}
//定义链表
type LinkTable struct {
HeadNode *LinkNode
TailNode *LinkNode
Length uint
}
2.定义初始化的方法
//构造结点
func NewNode(data interface{}) *LinkNode {
return &LinkNode{nil, data}
}
//构建一个空表
func NewLinkTable() *LinkTable {
return &LinkTable{nil, nil, 0}
}
3.定义增删方法
//增
func (this *LinkTable) AddNode(p *LinkNode) bool {
if this == nil {
return false
}
//还是空表
if this.HeadNode == nil {
this.HeadNode = p
this.TailNode = p
this.Length = 1
return true
}
this.TailNode.NextNode = p
this.TailNode = p
this.Length++
return true
}
//删
func (this *LinkTable) DelNode(p *LinkNode) bool {
if this == nil || this.HeadNode == nil {
return false
}
var pre *LinkNode = this.HeadNode
if pre == p {
this.HeadNode = nil
this.TailNode = nil
this.Length--
return true
}
cur := pre.NextNode
for cur != nil {
if cur == p {
//找到了
pre.NextNode = cur.NextNode
this.Length--
return true
}
pre = cur
cur = cur.NextNode
}
return false
}
4.将编写好的文件打包
进入编写库文件代码的文件夹,终端输入go install,可见已经打包成功

5.编写测试用例
记得要引入自己的包
import (
"fmt"
"menu/software-engineering/util"
"os"
)
func main() {
table := util.NewLinkTable()
node1 := util.NewNode(1)
table.AddNode(node1)
node2 := util.NewNode(2)
table.AddNode(node2)
for p := table.HeadNode; p != nil; p = p.NextNode {
data := p.Data.(int)
fmt.Println(data)
}
}

测试成功


上传成功,版本库地址:
https://gitee.com/zhou-pufan/software-engineering.git
作者: 599