571
社区成员
发帖
与我相关
我的任务
分享实验要求:
用Rust或Go编写一个Linktable的库,写一个帖子分享一下定义接口和设计一个程序库的心得体会
定义链表和链表节点
//定义链表节点
type LinkTableNode struct {
pNext *LinkTableNode
}
//定义链表
type LinkTable struct {
pHead *LinkTableNode
pTail *LinkTableNode
Nodecount int
mutex sync.Mutex
}
LinkTable的相关操作
参照C语言定义的Linktable,我分别实现了创建链表、删除链表、添加节点、删除节点、获取链表的头结点、获取给定节点的下一个节点这几种操作。
创建链表
//创建链表
func CreateLinkTable() *LinkTable {
var pLinkTable *LinkTable = new(LinkTable)
if pLinkTable == nil {
return nil
}
pLinkTable.pHead = nil
pLinkTable.pTail = nil
pLinkTable.Nodecount = 0
return pLinkTable
}
对于创建链表操作,我们将头尾节点都置为nil,链表的节点数置为0,返回创建的链表。
删除链表
//删除整个链表
func DeleteLinkTable(pLinkTable *LinkTable) bool {
if pLinkTable == nil {
return FAILURE
}
for pLinkTable.pHead != nil {
var p *LinkTableNode = pLinkTable.pHead
pLinkTable.mutex.Lock()
pLinkTable.pHead = p.pNext
pLinkTable.Nodecount--
pLinkTable.mutex.Unlock()
}
pLinkTable.pHead = nil
pLinkTable.pTail = nil
pLinkTable.Nodecount = 0
return SUCCESS
}
对于删除链表操作,使用循环删除链表中所有的节点
添加节点
//添加节点
func AddLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) bool {
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.Nodecount++
pLinkTable.mutex.Unlock()
return SUCCESS
}
将节点插入到链表的最尾端,先判断链表中是否有节点,如果没有,则将头尾节点都置为插入的节点;如果插入前链表不为空,则将其插入到尾结点的后面。
删除指定节点
//删除LinkTableNode节点
func DelLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) bool {
if pLinkTable == nil || pNode == nil {
return FAILURE
}
pLinkTable.mutex.Lock()
if pLinkTable.pHead == pNode {
pLinkTable.pHead = pLinkTable.pHead.pNext
pLinkTable.Nodecount--
if pLinkTable.Nodecount == 0 {
pLinkTable.pTail = nil
}
pLinkTable.mutex.Unlock()
return SUCCESS
}
var temp *LinkTableNode = pLinkTable.pHead
for temp != nil {
if temp.pNext == pNode {
temp.pNext = temp.pNext.pNext
pLinkTable.Nodecount--
if pLinkTable.Nodecount == 0 {
pLinkTable.pTail = nil
}
pLinkTable.mutex.Unlock()
return SUCCESS
}
temp = temp.pNext
}
pLinkTable.mutex.Unlock()
return FAILURE
}
如果头结点就是要删除的节点,则将新的头结点置为他的后一个节点;如果不是,则进行查找待删除节点,再进行删除操作。
获取链表的头结点
//获取LinkTable头节点
func GetLinkTableHead(pLinkTable *LinkTable) *LinkTableNode {
if pLinkTable == nil {
return nil
}
return pLinkTable.pHead
}
获取指定节点的下一个节点
//获取LinkTableNode的下一个节点
func GetNextLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) *LinkTableNode {
if pLinkTable == nil || pNode == nil {
return nil
}
var temp *LinkTableNode = pLinkTable.pHead
for temp != nil {
if temp == pNode {
return temp.pNext
}
temp = temp.pNext
}
return nil
}
先找到指定的节点,然后返回它的下一个节点;如果找不到指定节点,则返回nil
查找指定节点
func SelectLinkTableNode(findNode *LinkTableNode, pLinkTable *LinkTable) bool {
if pLinkTable == nil || findNode == nil {
return FAILURE
}
var temp *LinkTableNode = pLinkTable.pHead
for temp != nil {
if temp == findNode {
return SUCCESS
}
temp = temp.pNext
}
return FAILURE
}
与查找一个节点的下一个节点类似,遍历链表,找到即返回SUCCESS,未找到则返回FAILURE
上传到gitee仓库

可以看到,上传成功了

作者:365