package list 代码

 package list
import (
"fmt"
)
// 数据接口
type ElemType interface{}
// 节点
type Node struct{
Data ElemType
Pre *Node
Next *Node
}
// 初始化链表
func InitList(s *Node)(){
//s := new(Node)
s.Next,s.Pre = s,s
s.Data = nil
//return &Node{nil,s,s} //相当于用s重新构造了一个对象,新的对象的地址不是s,不能和s构成一个环
return
}
// 在after和before之间添加s
func add(s,after,before *Node){
after.Next = s
s.Pre = after
s.Next = before
before.Pre = s
}
// 将x元素添加到链表尾部
func (list *Node)Add_tail(x ElemType){
s := new(Node)
s.Data = x
add(s,list.Pre,list)
}
// 将x元素添加到链表头部
func (list *Node)Add_head(x ElemType){
s := new(Node)
s.Data = x
add(s,list,list.Next)
}
// 判断链表是否为空
func (list *Node)IsEmpty() bool {
if list.Pre == list {
return true
}
return false
}
// 从头到尾查找元素
func (list *Node)Find(x ElemType) *Node{
if list.IsEmpty() {
return nil
}
s := list.Next
for s != list{
if x == s.Data{
return s
} else {
s = s.Next
}
}
return nil
}
func delete(pre,next *Node){
pre.Next = next
next.Pre = pre
}
// 删除节点
func (list *Node)Delete(s *Node){
delete(s.Pre,s.Next)
s.Pre,s.Next = nil,nil
}
// 删除从头到尾找到的第一个元素
func (list *Node)DeleteVal(x ElemType) bool {
result := list.Find(x)
if result == nil {
return false
}
list.Delete(result)
return true
}
func (list *Node)MoveToHead(s *Node){
list.Delete(s)
add(s,list,list.Next)
}
// 将元素移到队首
func (list *Node)MoveValToHead(x ElemType) bool {
result := list.Find(x)
if result == nil {
return false
}
list.MoveToHead(result)
return true
}
func (list *Node)MoveToTail(s *Node){
list.Delete(s)
add(s,list.Pre,list)
}
// 将元素移到队尾
func (list *Node)MoveValToTail(x ElemType) bool {
result := list.Find(x)
if result == nil {
return false
}
list.MoveToTail(result)
return true
}
func list_splice(add,after,before *Node){
first,last := add.Next,add.Pre
first.Pre = after
after.Next = first
last.Next = before
before.Pre = last
}
// 将链表add尾插到list链表上
func (list *Node)List_splice_tail(add *Node)bool {
if list == add {
return false
}
if !add.IsEmpty(){
list_splice(add,list.Pre,list)
InitList(add)
}
return true
}
// 将链表add头插到list链表上
func (list *Node)List_splice_head(add *Node)bool {
if list == add {
return false
}
if !add.IsEmpty(){
list_splice(add,list,list.Next)
InitList(add)
}
return true
}
// 对列表中的所有元素均执行 参数为函数
func (list *Node)Foreach(f func(*Node)) bool {
if list.IsEmpty(){
return false
}
s := list.Next
for s != list{
f(s)
s = s.Next
}
return true
}
func (list *Node) Print() error {
fmt.Println("++++Print begin++++")
defer fmt.Println("-----Print end-----")
if list.IsEmpty() {
fmt.Println("list is empty")
return nil
}
s := list.Next
for s != list {
fmt.Println("Data is :",s.Data)
s = s.Next
}
return nil
}

测试代码

package main
import (
"fmt"
"./list"
)
func test_03(){
list_i := new(list.Node)
list.InitList(list_i)
val := []int{,,,,}
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 = ""
}
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()
}

go例子(一) 使用go语言实现linux内核中的list_head的更多相关文章

  1. C语言在linux内核中do while(0)妙用之法

    为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) \ do { \ fpr ...

  2. linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

    学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...

  3. C语言之linux内核实现最大公约数算法

    最大公约数算法,又称欧几里德算法,至今已有几千年的历史了.在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算. 两个整数的最大 ...

  4. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  5. Linux内核中的信号机制--一个简单的例子【转】

    本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...

  6. C语言之linux内核实现平方根计算算法

    关于平方根的计算,在linux内核中也有实现,就像math.h数学库里的sqrt这个函数一样. 平方根的公式定义: 如果一个非负数x的平方等于a,即    ,    ,那么这个非负数x叫做a的算术平方 ...

  7. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  8. Linux内核中双向链表的经典实现

    概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...

  9. Linux内核中的fastcall和asmlinkage宏

    代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...

随机推荐

  1. HDU1233 还是畅通工程

    题目: Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连 ...

  2. 使用fastai完成图像分类

    by Wenqi Sun 1 min read Categories Deep Learning Tags Fastai CNN Application 1. 使用现有数据集进行分类 图像数据为Oxf ...

  3. c++入门资源

    http://www.cnblogs.com/jackyyang7/articles/2479482.htmlvs2010编译器的使用 https://www.cnblogs.com/me115/ar ...

  4. git创建/合并分支/删除分支/将修改后的内容同步到GitHub远程仓库

    1.创建分支并切换到刚创建的分支(这里创建新的分支来修改README.md的内容然后将创建的分支与master分支合并,最后删除创建的分支) $ git checkout -b 分支名 Switche ...

  5. Maximum Value(CodeForces - 484B)

    Maximum Value Time limit 1000 ms Memory limit 262144 kB You are given a sequence a consisting of n i ...

  6. 添砖加瓦:几种常见的数据摘要算法(MD5、CRC32、SHA1和SHA256)

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

  7. 360若真入股HTC 到底是谁来拯救谁

    到底是谁来拯救谁" title="360若真入股HTC 到底是谁来拯救谁"> 我总是持有一种观点,那就是拯救是相互的.就像老师拯救"堕落"学生, ...

  8. MyBatis 判断条件为等于的时候,常量需要加 .toString()

    当MyBatis 判断条件为等于的时候,常量需要加 .toString() 来转换,这种方法是稳定的,推荐使用,比如: <!-- 正确的,稳定,推荐使用 --> <if test=& ...

  9. CSS——NO.9(颜色值和长度值)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  10. java.lang.SecurityException: class "javax.servlet.AsyncContext"'s signer information does not match signer information of other classes in the same package

    最近在写个Http协议的压测挡板时,遇到以下错误. 2018-03-08 10:34:07.808:INFO:oejs.Server:jetty-8.1.9.v20130131 2018-03-08 ...