用go语言编写LinkTable库并测试

xiwenchi 2022-04-06 22:03:51

1 定义数据结构

type Node struct{
	data int
	next *Node
}

type LinkTable struct{
	head *Node
	tail *Node
	len int
}

2 初始化链表和节点

//创建链表
func createLinkTable() *LinkTable{
	 var  Link *LinkTable=new(LinkTable)
	 Link.head=nil
	 Link.tail=nil
	 Link.len=0
	return  Link
}
//创建节点
func createNode (v int)*Node{
	var p *Node=new(Node)
	p.data=v
	return p
}

3销毁链表

//销毁链表
func (link *LinkTable)destroyLinkTable()bool{
	link.head=nil
	link.tail=nil
	link.len=0
	return true
}

 

4获取链表长度及判空

//查看链表的长度
func Querylen(link *LinkTable) int {
	return link.len
}
//判断链表是否为空
func isempty(link *LinkTable)bool  {
	if link.len==0{
		return true
	}
	return false
}

5遍历链表及查询操作

//遍历链表
func Showlink(link *LinkTable) {
	if link==nil{
		return
	}
	var p *Node=link.head
	for p!=nil{
		fmt.Println(p.data)
		p=p.next
	}
}
//查询值为x的节点个数
func Querynums(link *LinkTable,x int)int{
	if link==nil{
		return -1
	}
	var nums int=0
	var p *Node=link.head
	for p!=nil{
		if p.data==x{
			nums++
		}
		p=p.next
	}
	return nums
}

6链表的插入操作

//插入节点(尾插)
func (link *LinkTable)TailinsertNode(node *Node) bool{
	if link==nil||node==nil{
		return false
	}
	if link.head==nil{
		link.head=node
		link.tail=node
		link.len++
	     return true
	}
	link.tail.next=node
	link.tail=node
	link.len++
	return true
}
//插入节点(头插)
func (link *LinkTable)HeadinsertNode(node *Node) bool{
	if link==nil||node==nil{
		return false
	}
	if link.head==nil{
		link.head=node
		link.tail=node
		link.len++
	     return true
	}
	node.next=link.head
	link.head=node
	link.len++
	return true
}

7链表的删除操作

//删除指定节点
func (link *LinkTable)deletenode(node *Node) bool{
	if link==nil||node==nil{
		return false
	}
	if node==link.head{
		link.head=link.head.next
		link.len--
		return true
	}
	var prenode *Node=link.head
	for prenode.next!=nil{
		if prenode.next==node{
			prenode.next=node.next
			node=nil
			link.len--
			return true
		}
		prenode=prenode.next
	}
	return false
}

8测试

//测试
func main(){
	var l *LinkTable=createLinkTable()
	var node1 *Node=createNode(1)
	var node2 *Node=createNode(2)
	var node3 *Node=createNode(3)
	var node4 *Node=createNode(1)
	l.TailinsertNode(node1)
	l.TailinsertNode(node2)
	l.TailinsertNode(node3)
	l.TailinsertNode(node4)
	fmt.Println( "遍历")
	Showlink(l)
	fmt.Println( "查询值为1节点的个数")
	fmt.Println( Querynums(l,1))
	fmt.Println( "删除节点3")
	l.deletenode(node3)
	fmt.Println( "遍历")
	Showlink(l)
	fmt.Println( "输出长度")
	fmt.Println( Querylen(l))

}

测试结果如下

9将代码上传至Gitee

心得体会

通过编写linktable库,对go语言的使用熟练度有所提升,也多gitee的操作更加熟练,并且重温链表这一数据结构。

gitee 地址https://gitee.com/xiwenchi/menu.git

作者:469

 

 

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

571

社区成员

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

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