使用Go语言编写Link Table库

使用Go语言编写一个Linktable的库并分享定义接口和设计一个程序库的心得体会,将代码上传至GitHub

代码参考Lab4

编写LinkTable

定义结点和链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* Define LinkTable Node
*/
type LinkTableNode struct {
pNext *LinkTableNode
}

/*
* Define LinkTable
*/
type LinkTable struct {
pHead *LinkTableNode
pTail *LinkTableNode
SumOfNode int
mutex sync.Mutex
}

定义LinkTable的创建与删除操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
* Create a LinkTable
*/
func CreateLinkTable() *LinkTable {
var pLinkTable *LinkTable = new(LinkTable)
if pLinkTable == nil {
return nil
}
pLinkTable.pHead = nil
pLinkTable.pTail = nil
pLinkTable.SumOfNode = 0
return pLinkTable
}

/*
* Delete a LinkTable
*/
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
}

定义LinkTable中结点的插入和删除操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
* Add a LinkTableNode to LinkTable
*/
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
}

/*
* Delete a LinkTableNode from LinkTable
*/
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
}

定义LinkTable的基础查找操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
* get LinkTableHead
*/
func GetLinkTableHead(pLinkTable *LinkTable) *LinkTableNode {
if pLinkTable == nil {
fmt.Println("LinkTable is empty")
return nil
}
return pLinkTable.pHead
}

/*
* get next LinkTableNode
*/
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
}

menu的命令修改下次一定,库的接口设计尽量与业务逻辑独立,从而提高程序的复用性

在GitHub上更新代码

代码地址

1
2
3
git add linktable.go
git commit -m "add basic link table interface"
git push

image-20220406175330301

作者:406