571
社区成员
发帖
与我相关
我的任务
分享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