571
社区成员
发帖
与我相关
我的任务
分享该实验通过go编写一个LinkeTable的库并发布到gitee仓库
代码如下:
package linktable
import (
"fmt"
"sync"
)
const SUCCESS = 0
const FAILURE = -1
type LinkTableNode struct {
pNext *LinkTableNode
}
/*
* 链表定义
*/
type LinkTable struct {
pHead *LinkTableNode
pTail *LinkTableNode
SumOfNode int
mutex sync.Mutex
}
/*
* 创建一个链表
*/
func CreateLinkTable() *LinkTable {
var pLinkTable *LinkTable = new(LinkTable)
if pLinkTable == nil {
return nil
}
pLinkTable.pHead = nil
pLinkTable.pTail = nil
pLinkTable.SumOfNode = 0
return pLinkTable
}
/*
* 删除一个链表
*/
func DeleteLinkTable(pLinkTable *LinkTable) int {
if pLinkTable == nil {
return FAILURE
}
for pLinkTable.pHead != nil {
var p *LinkTableNode = pLinkTable.pHead
pLinkTable.mutex.Lock()
pLinkTable.pHead = p.pNext
pLinkTable.SumOfNode--
pLinkTable.mutex.Unlock()
}
pLinkTable.pHead = nil
pLinkTable.pTail = nil
pLinkTable.SumOfNode = 0
return SUCCESS
}
/*
* 添加一个·链表节点
*/
func AddLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
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.SumOfNode++
pLinkTable.mutex.Unlock()
return SUCCESS
}
/*
* 删除一个链表几点
*/
func DelLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) int {
if pLinkTable == nil || pNode == nil {
return FAILURE
}
pLinkTable.mutex.Lock()
if pLinkTable.pHead == pNode {
pLinkTable.pHead = pLinkTable.pHead.pNext
pLinkTable.SumOfNode--
if pLinkTable.SumOfNode == 0 {
pLinkTable.pTail = nil
}
pLinkTable.mutex.Unlock()
return SUCCESS
}
var pTempNode *LinkTableNode = pLinkTable.pHead
for pTempNode != nil {
if pTempNode.pNext == pNode {
pTempNode.pNext = pTempNode.pNext.pNext
pLinkTable.SumOfNode--
if pLinkTable.SumOfNode == 0 {
pLinkTable.pTail = nil
}
pLinkTable.mutex.Unlock()
return SUCCESS
}
pTempNode = pTempNode.pNext
}
pLinkTable.mutex.Unlock()
return FAILURE
}
/*
* 获取链表头部节点
*/
func GetLinkTableHead(pLinkTable *LinkTable) *LinkTableNode {
if pLinkTable == nil {
fmt.Println("LinkTable is empty")
return nil
}
return pLinkTable.pHead
}
/*
* 获得下一个链表节点
*/
func GetNextLinkTableNode(pLinkTable *LinkTable, pNode *LinkTableNode) *LinkTableNode {
if pLinkTable == nil || pNode == nil {
fmt.Println("Linktable is empty")
return nil
}
var pTempNode *LinkTableNode = pLinkTable.pHead
for pTempNode != nil {
if pTempNode == pNode {
return pTempNode.pNext
}
pTempNode = pTempNode.pNext
}
return nil
}
发布到git仓库


仓库链接:https://gitee.com/lr19990903/lin-k
实验总结与心得体会:通过使用go语言编写了一个链表库LinkTable,我对定义接口以及设计一个程序库有了新的理解:定义接口或者一个程序库可以使我们的日常开发解耦,当我们要使用库的功能时直接传入数据调用库函数即可,同时,当软件系统结构发生变化时,修改代码不再需要“牵一发而动全身”,只需要修改业务相关代码即可,设计程序库(造轮子)是软件工程规范的一次良好实践。
姓名:罗锐 学号后三位:345