用Go编写一个LinkTable库

wangffan12 2022-04-07 14:32:28

一、编写LinkTable库

1、数据类型定义

type Node struct {
	value interface{} //值
	next  *Node       //下一节点
}

type LinkTable struct {
	sumOfNode int //节点个数
	pHead     *Node
	pTail     *Node
}

2、创建链表

func createLinkTable() *LinkTable {
	var pLinkTable *LinkTable = new(LinkTable)
	if pLinkTable == nil {
		fmt.Println("CreateLinkTable error.")
		return nil
	}
	pLinkTable.sumOfNode = 0
	pLinkTable.pHead = nil
	pLinkTable.pTail = nil
	return pLinkTable
}

3、在链表尾部添加结点

//在链表尾部添加节点
func (pLinkTable *LinkTable) addLinkTableNode(value interface{}) bool {
	if pLinkTable == nil || value == nil {
		fmt.Println("The input has something wrong.")
		return false
	}

	pNode := NewNode(value, nil)

	if pLinkTable.sumOfNode == 0 {
		//链表为空
		pLinkTable.pHead = pNode
		pLinkTable.pTail = pNode
		pLinkTable.sumOfNode = 1
	} else {
		//链表不为空
		pLinkTable.pTail.next = pNode
		pLinkTable.pTail = pNode
		pLinkTable.sumOfNode++
	}

	return true
}

4、获取链表的长度

//获取链表长度
func (pLinkTable *LinkTable) Length() int {
	return pLinkTable.sumOfNode
}

5、获取链表头结点

//获取头节点
func (pLinkTable *LinkTable) getLinkTableHead() *Node {
	if pLinkTable == nil {
		fmt.Println("The linktable is empty")
		return nil
	}
	return pLinkTable.pHead
}

6、获取链表尾结点

//获取尾节点
func (pLinkTable *LinkTable) getLinkTableTail() *Node {
	if pLinkTable == nil {
		fmt.Println("The linktable is empty")
		return nil
	}
	return pLinkTable.pTail
}

7、按索引查找某结点

func (pLinkTable *LinkTable) getLinkTableNodeByIndex(index int) *Node {
	if pLinkTable == nil {
		fmt.Println("The linktable is empty")
		return nil
	}

	if index < 0 || index > pLinkTable.sumOfNode {
		return nil
	}

	tempNode := pLinkTable.pHead
	for j := 0; j < index; j++ {
		tempNode = tempNode.next
	}
	return tempNode
}

8、按值查找某结点

func (pLinkTable *LinkTable) getLinkTableNodeByValue(v interface{}) *Node {
	if pLinkTable == nil {
		fmt.Println("The linktable is empty")
		return nil
	}
	tempNode := pLinkTable.pHead
	for tempNode != nil {
		if tempNode.value == v {
			return tempNode
		}
		tempNode = tempNode.next
	}
	return nil
}

9、链表循环输出

//链表循环输出
func (pLinkTable *LinkTable) showLinkTable() bool {
	if pLinkTable == nil {
		fmt.Println("The linktable is empty")
		return false
	}
	tempNode := pLinkTable.pHead
	for tempNode != nil {
		fmt.Print(tempNode.value)
		fmt.Print(" ")
		tempNode = tempNode.next
	}
	fmt.Println()
	return true
}

10、删除指定结点

//删除指定节点
func (pLinkTable *LinkTable) delLinkTableNode(pNode *Node) bool {
	if pLinkTable == nil || pNode == nil {
		fmt.Println("The input has something wrong.")
		return false
	}

	if pLinkTable.pHead == pNode {
		pLinkTable.pHead = pLinkTable.pHead.next
		pLinkTable.sumOfNode--
		if pLinkTable.sumOfNode == 0 {
			pLinkTable.pTail = nil
		}
		return true
	}

	tempNode := pLinkTable.pHead
	for tempNode != nil {
		if tempNode.next == pNode {
			pLinkTable.sumOfNode--
			//链表长度为0,或删除尾结点时,尾结点为空
			if pLinkTable.sumOfNode == 0 || pNode == pLinkTable.pTail {
				pLinkTable.pTail = nil
			}
			tempNode.next = tempNode.next.next

			return true
		}
		tempNode = tempNode.next
	}
	fmt.Println("Delete is failed.")
	return false
}

11、删除整个链表

//删除整个链表
func (pLinkTable *LinkTable) deleteLinkTable() bool {
	if pLinkTable == nil {
		fmt.Println("DeleteLinkTable is failed.")
		return false
	}
	for pLinkTable.sumOfNode != 0 {
		tempNode := pLinkTable.pHead
		pLinkTable.pHead = pLinkTable.pHead.next
		tempNode.next = nil
		pLinkTable.sumOfNode--
	}
	pLinkTable.pHead = nil
	pLinkTable.pTail = nil
	return true
}

12、测试

func main() {
	LinkTable := createLinkTable()
	LinkTable.addLinkTableNode(1)
	LinkTable.addLinkTableNode(2)
	LinkTable.addLinkTableNode(3)
	LinkTable.addLinkTableNode(4)
	LinkTable.addLinkTableNode(5)
	LinkTable.addLinkTableNode(6)
	fmt.Println("打印现有链表:")
	LinkTable.showLinkTable()
	fmt.Println("删除值为1的节点")
	tempNode := LinkTable.getLinkTableNodeByValue(1)
	LinkTable.delLinkTableNode(tempNode)
	fmt.Println("打印链表:")
	LinkTable.showLinkTable()
	fmt.Println("删除index为2节点")
	tempNode = LinkTable.getLinkTableNodeByIndex(2)
	LinkTable.delLinkTableNode(tempNode)
	fmt.Println("打印现有链表:")
	LinkTable.showLinkTable()
	fmt.Println("输出链表长度:")
	fmt.Println(LinkTable.Length())
	fmt.Println("删除链表尾节点")
	tempNode = LinkTable.getLinkTableTail()
	LinkTable.delLinkTableNode(tempNode)
	fmt.Println("打印链表:")
	LinkTable.showLinkTable()
	fmt.Println("删除整个链表")
	flag := LinkTable.deleteLinkTable()
	if flag == true {
		fmt.Println("删除成功")
	}
}

二、上传至GitHub

1、在git bash中输入如下语句:

git init
git status
git add .
git commit -m "init"
git remote add origin 仓库地址
git push -u origin "master"

仓库地址:https://github.com/wangffan1/LinkTable.git

 作者:437

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

571

社区成员

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

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