前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go例子(一) 使用go语言实现linux内核中的list_head

go例子(一) 使用go语言实现linux内核中的list_head

作者头像
杜争斌
发布2022-04-27 19:23:13
3000
发布2022-04-27 19:23:13
举报
文章被收录于专栏:我的博文我的博文

package list 代码

代码语言:javascript
复制
  1 package list
  2 import (
  3     "fmt"
  4 )
  5 // 数据接口
  6 type ElemType interface{}
  7 // 节点
  8 type Node struct{
  9     Data ElemType
 10     Pre *Node
 11     Next *Node
 12 }
 13 // 初始化链表
 14 func InitList(s *Node)(){
 15     //s := new(Node)
 16     s.Next,s.Pre = s,s
 17     s.Data = nil
 18     //return &Node{nil,s,s} //相当于用s重新构造了一个对象,新的对象的地址不是s,不能和s构成一个环
 19     return 
 20 }
 21 // 在after和before之间添加s
 22 func add(s,after,before *Node){
 23     after.Next = s
 24     s.Pre = after
 25     s.Next = before
 26     before.Pre = s
 27 }
 28 // 将x元素添加到链表尾部
 29 func (list *Node)Add_tail(x ElemType){
 30     s := new(Node)
 31     s.Data = x
 32     add(s,list.Pre,list)
 33 }
 34 // 将x元素添加到链表头部
 35 func (list *Node)Add_head(x ElemType){
 36     s := new(Node)
 37     s.Data = x
 38     add(s,list,list.Next)
 39 }
 40 // 判断链表是否为空
 41 func (list *Node)IsEmpty() bool {
 42     if list.Pre == list {
 43         return true
 44     }
 45     return false
 46 }
 47 // 从头到尾查找元素
 48 func (list *Node)Find(x ElemType) *Node{
 49     if list.IsEmpty() {
 50         return nil
 51     }
 52     s := list.Next
 53     for s != list{
 54         if x == s.Data{
 55             return s
 56         } else {
 57             s = s.Next
 58         }
 59     }
 60     return nil
 61 }
 62 func delete(pre,next *Node){
 63     pre.Next = next
 64     next.Pre = pre
 65 }
 66 // 删除节点
 67 func (list *Node)Delete(s *Node){
 68     delete(s.Pre,s.Next)
 69     s.Pre,s.Next = nil,nil
 70 }
 71 // 删除从头到尾找到的第一个元素
 72 func (list *Node)DeleteVal(x ElemType) bool {
 73     result := list.Find(x)
 74     if result == nil {
 75         return false
 76     }
 77     list.Delete(result)
 78     return true
 79 }
 80 func (list *Node)MoveToHead(s *Node){
 81     list.Delete(s)
 82     add(s,list,list.Next)
 83 }
 84 // 将元素移到队首
 85 func (list *Node)MoveValToHead(x ElemType) bool {
 86     result := list.Find(x)
 87     if result == nil {
 88         return false
 89     }
 90     list.MoveToHead(result)
 91     return true
 92 }
 93 func (list *Node)MoveToTail(s *Node){
 94     list.Delete(s)
 95     add(s,list.Pre,list)
 96 }
 97 // 将元素移到队尾
 98 func (list *Node)MoveValToTail(x ElemType) bool {
 99     result := list.Find(x)
100     if result == nil {
101         return false
102     }
103     list.MoveToTail(result)
104     return true
105 }
106 func list_splice(add,after,before *Node){
107     first,last := add.Next,add.Pre
108     first.Pre = after
109     after.Next = first
110     last.Next = before
111     before.Pre = last
112 }
113 // 将链表add尾插到list链表上
114 func (list *Node)List_splice_tail(add *Node)bool {
115     if list == add {
116         return false
117     }
118     if !add.IsEmpty(){
119         list_splice(add,list.Pre,list)
120         InitList(add)
121     }
122     return true
123 }
124 // 将链表add头插到list链表上
125 func (list *Node)List_splice_head(add *Node)bool {
126     if list == add {
127         return false
128     }
129     if !add.IsEmpty(){
130         list_splice(add,list,list.Next)
131         InitList(add)
132     }
133     return true
134 }
135 // 对列表中的所有元素均执行 参数为函数
136 func (list *Node)Foreach(f func(*Node)) bool {
137     if list.IsEmpty(){
138         return false
139     }
140     s := list.Next
141     for s != list{
142         f(s)
143         s = s.Next
144     }
145     return true
146 }
147 func (list *Node) Print() error {
148     fmt.Println("++++Print begin++++")
149     defer fmt.Println("-----Print end-----")
150     if list.IsEmpty() {
151         fmt.Println("list is empty")
152         return nil
153     }
154     s := list.Next
155     for s != list {
156         fmt.Println("Data is :",s.Data)
157         s = s.Next
158     }
159     return nil
160 }

测试代码

代码语言:javascript
复制
package main
import (
    "fmt"
    "./list"
)
func test_03(){
    list_i := new(list.Node)
    list.InitList(list_i)
    val := []int{1,2,3,4,5}
    list_i.Print()
    for _,v := range val {
        list_i.Add_tail(v)
    }
    list_i.Print()
}
func test_04(){
    list_s := new(list.Node)
    list.InitList(list_s)
    val := []string{"wo","shi","cheng","xu","yuan"}
    list_s.Print()
    for _,v := range val {
        list_s.Add_tail(v)
    }
    list_s.Print()
}

func test_05(){
    list_s := new(list.Node)
    list.InitList(list_s)
    val := []string{"wo","shi","cheng","xu","yuan"}
    list_s.Print()
    for _,v := range val {
        list_s.Add_head(v)
    }
    list_s.Print()
    list_s.MoveValToHead("shi")
    list_s.Print()
    list_s.MoveValToTail("xu")
    list_s.Print()
    list_s.DeleteVal("shi")
    list_s.Print()
    list_s.DeleteVal("xu")
    list_s.Print()
}
func test_06(){
    list_s := new(list.Node)
    list.InitList(list_s)
    list_s2 := new(list.Node)
    list.InitList(list_s2)
    val := []string{"wo","shi","cheng","xu","yuan"}
    list_s.Print()
    list_s2.Print()
    for _,v := range val {
        list_s.Add_head(v)
        list_s2.Add_tail(v)
    }
    list_s.Print()
    list_s2.Print()
    ok := list_s.List_splice_head(list_s)
    if ok {
        fmt.Println("success")
        list_s.Print()
        list_s2.Print()
    }else{
        fmt.Println("fail")
    }
    ok = list_s.List_splice_head(list_s2)
    if ok {
        fmt.Println("success")
        list_s.Print()
        list_s2.Print()
    }else{
        fmt.Println("fail")
    }
}
func test_07(){
    list_s := new(list.Node)
    list.InitList(list_s)
    list_s2 := new(list.Node)
    list.InitList(list_s2)
    val := []string{"wo","shi","cheng","xu","yuan"}
    list_s.Print()
    list_s2.Print()
    for _,v := range val {
        list_s.Add_head(v)
        list_s2.Add_tail(v)
    }
    list_s.Print()
    list_s2.Print()
    ok := list_s.List_splice_tail(list_s)
    if ok {
        fmt.Println("success")
        list_s.Print()
        list_s2.Print()
    }else{
        fmt.Println("fail")
    }
    ok = list_s.List_splice_tail(list_s2)
    if ok {
        fmt.Println("success")
        list_s.Print()
        list_s2.Print()
    }else{
        fmt.Println("fail")
    }
}
func printNode(s *list.Node){
    fmt.Println("Data:",s.Data)
}
func changeData(s *list.Node){
    s.Data = "123"
}
func test_08(){
    list_s := new(list.Node)
    list.InitList(list_s)
    val := []string{"wo","shi","cheng","xu","yuan"}
    list_s.Print()
    for _,v := range val {
        list_s.Add_head(v)
    }
    list_s.Foreach(printNode)
    list_s.Foreach(changeData)
    list_s.Foreach(printNode)
}
func main(){
    //test_03()
    //test_04()
    //test_05()
    //test_06()
    //test_07()
    test_08()
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档