• Go语言实现数据结构(一)单链表


    1.基本释义

    2.结构体设计

    3.基本方法设计

    4.Main函数测试

    1. 基本释义

      线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据;接下来我们重点实现基于Go语言的链式存储线性表。

                                                

      

    2. 结构体设计

       每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,首尾相连,形成链表。特别注意的是每个链表必须包含头结点(数据域为空);

    //导入包
    package main
    import "fmt"
    //创建 结点 结构体
    type Node struct{
    	Data interface{}
    	Next *Node               //  Next = &Node
    }
    //链表 结构体
    type LList struct{
    	Head *Node
    	Length int
    }

    3. 基本方法设计

      在创建完链表后,我们将实现链表的基本操作和辅助操作,基本操作指的是(新增)插入数据、删除数据、查找数据、求链表长度;而辅助操作指的是创建结点、创建(初始化 )链表、判断是否为空链表,此处和其他语言不同之处是Go语言具有垃圾自动回收的特性,因此不需要释放指针或内存,后续没有用到的变量Go语言会自动回收。

    a.设计接口

    type Method interface {
    	Insert(i int,v interface{})            //增
    	Delete(i int)                          //删
    	GetLength() int                        //getLength
    	Search(v interface{}) int              //查
    	isNull()bool                           //判断链表是否为空
    }
    

    b.设计初始化函数

    //创建结点
    func CreateNode(v interface{})*Node{
    	return &Node{v,nil}
    }
    //创建空链表
    func CreateList()*LList{
    	return &LList{CreateNode(nil),0}
    }
    

    c.基于链表结构体 LList 实现接口 Method 中的基本方法

    //在i处插入节点(前插)
    func (list *LList)Insert(i int,v interface{}){
    	s := CreateNode(v)  //*Node
    	pre := list.Head  //*Node
    	for count:=0;count<=i-1;count++{
    		if count == i-1{
    			s.Next = pre.Next
    			pre.Next = s
    			list.Length++
    		}
    		pre = pre.Next
    
    	}
    }
    //删除i处节点
    func (list *LList)Delete(i int){
    	pre := list.Head
    	for count:=0;count<=i-1;count++{
    		s := pre.Next
    		if count == i-1{
    			pre.Next = s.Next
    			list.Length--
    		}
    		pre = pre.Next
    	}
    }
    //返回链表长度
    func (list *LList)GetLength() int{
    	pre := list.Head
    	for pre.Next!=nil{
    		list.Length++
    	}
    	return list.Length
    }
    //查值v所在位置
    func (list *LList)Search(v interface{}) int{
    	pre := list.Head.Next
    	for i:=1;i<=list.Length;i++{
    		if pre.Data == v{
    			return i
    		}
    		pre = pre.Next
    	}
    	return 0
    }
    //判空
    func (list *LList) isNull() bool{
    	pre := list.Head.Next
    	if pre == nil{
    		return true
    	}
    	return false
    }
    

    d.设计链表打印输出函数

    //打印链表
    func PrintList(list *LList){
    	pre := list.Head  //*Node
    	fmt.Println("LList shows as follow:...")
    	for i:=0;i<=list.Length;i++{
        	fmt.Printf( "%v
    ",pre)
    		pre  = pre.Next
    	}
    }

    4.Main函数测试

    func main(){
    	lList := CreateList()
    	//fmt.Println("List is Null:",lList.isNull())
    	var M Method
    	M = lList
    	M.Insert(1,3)
    	M.Insert(2,6)
    	M.Insert(1,5)
    	PrintList(lList)
    	fmt.Println("List length is:",lList.Length)
    	fmt.Println("元素6在位置  ",M.Search(6))
    	fmt.Println("元素100在位置  ",M.Search(100))
    	fmt.Println("List is Null:",lList.isNull())
    	M.Delete(2)
    	PrintList(lList)
    	fmt.Println("List length is:",lList.Length)
    }  

    说明:以上Code可直接复现,关于插入法还有后插法,查找也可按索引位置查找,读者可自行复现。

  • 相关阅读:
    cocos2d-x 3.0 事件分发机制
    cocos2d-x Schedule详解
    OSG设置警告等级
    OSG四元数与欧拉角之间的转换
    编译OSG_FBX插件
    RakNet发送与接收数据
    RakNet基本教程
    IE不能上网,但是其他浏览器可以
    OSG计时器与时间戳
    添加OSG各种事件处理器
  • 原文地址:https://www.cnblogs.com/theaxjblog/p/10548728.html
Copyright © 2020-2023  润新知