使用Go语言编写一个Linktable库,并上传到gitee仓库当中

QQ小冰 2022-04-05 23:11:23

实验要求:

用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仓库

可以看到,上传成功了

Linktable库链接

作者:365

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

571

社区成员

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

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