Go编写一个LinkTable库

caosy233 2022-04-06 23:30:33

1、数据结构

分别定义了节点和链表类型

// 定义数据结构
type Node struct {
	data interface{} 
	next *Node
}
type LinkTable struct {
	headNode *Node //头节点,不存放数据
	length   int   //当前链表的长度
}

2、初始化

生成一个新节点,data数据和next指针都为nil,使其作为链表的头节点,不用来存放数据

//初始化
func initLinkTable() *LinkTable {
	node := new(Node)
	linkTable := new(LinkTable)
	linkTable.headNode = node
	linkTable.length = 0
	return linkTable
}

3、获取尾节点

// 获取尾节点
func getTailNode(linkTable *LinkTable) *Node {
	curNode := linkTable.headNode
	//当前链表只有一个头节点
	if curNode.next == nil {
		return linkTable.headNode
	}
	for curNode.next != nil {
		curNode = curNode.next
	}
	return curNode
}

4、插入元素

//插入元素
//头插法
func insertHeadNode(data interface{}, linkTable *LinkTable) {
	node := &Node{data, nil}
	node.next = linkTable.headNode.next
	linkTable.headNode.next = node
	linkTable.length++
}

//尾插法
func insertTailNode(data interface{}, linkTable *LinkTable) {
	node := &Node{data, nil}
	curNode := getTailNode(linkTable)
	curNode.next = node
	linkTable.length++
}

//指定位置插入节点
func append(index int, data interface{}, linktable *LinkTable) {
	if index <= 0 || index > linktable.length+1 {
		fmt.Println("当前位置错误")
		return
	}
	curNode := linktable.headNode
	//找到需要插入节点的前一个节点
	for j := 0; j < index-1; j++ {
		curNode = curNode.next
	}
	node := new(Node)
	node.data = data
	node.next = curNode.next
	curNode.next = node
	linktable.length++
}

5、查找元素

//按序号查找某节点
func findNodeByIndex(index int, linktable *LinkTable) *Node {
	if index <= 0 || index > linktable.length {
        fmt.Println("当前序号错误")
		return nil
	}
	curNode := linktable.headNode
	for j := 0; j < index; j++ {
		curNode = curNode.next
	}
	return curNode
}

//按值查找节点
func findNodeByValue(data interface{}, linktable *LinkTable) *Node {
	curNode := linktable.headNode.next
	for curNode != nil {
		if curNode.data == data {
			return curNode
		}
		curNode = curNode.next
	}
	return nil
}

6、删除元素

// 删除第i个节点
func deleteNode(index int, linktable *LinkTable) {
	if index <= 0 || index > linktable.length {
		fmt.Println("当前位置错误")
		return
	}
	curNode := linktable.headNode
	//找到需要删除节点的前一个节点
	for j := 0; j < index-1; j++ {
		curNode = curNode.next
	}
	curNode.next = curNode.next.next
	linktable.length--
}

7、测试

func main() {
	// var showmenu = menu()
	// showmenu()
	linktable := initLinkTable()

	insertTailNode(1, linktable)
	insertTailNode(2, linktable)
	insertTailNode(3, linktable)
	insertTailNode(4, linktable)
	insertTailNode(5, linktable)
	insertTailNode(6, linktable)

	fmt.Print("初始链表:")
	showLinkTableData(linktable)

	fmt.Print("在索引为3处插入值为7的节点:")
	append(3, 7, linktable)
	showLinkTableData(linktable)

	fmt.Print("查找索引为1的节点:")
	fmt.Println(findNodeByIndex(1, linktable))

	fmt.Print("查找值为6的节点:")
	fmt.Println(findNodeByValue(6, linktable))

	fmt.Print("删除第6个节点:")
	deleteNode(6, linktable)
	showLinkTableData(linktable)
}

8、上传github

代码链接:​​​​​​LinkTable

作者:104

 

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

571

社区成员

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

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