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\n",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可直接复现,关于插入法还有后插法,查找也可按索引位置查找,读者可自行复现。

Go语言实现数据结构(一)单链表的更多相关文章

  1. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  2. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  3. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  4. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

  5. 数据结构 - 静态单链表的实行(C语言)

    静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...

  6. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  7. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  8. 【数据结构】单链表&&静态链表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...

  9. Java数据结构之单链表

    这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...

  10. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

随机推荐

  1. 通过yum源在centOS7安装mysql8

    1.去官网下载rpm文件,该文件专门用于yum安装方式: 到官网https://www.mysql.com/downloads/下载社区版Community(针对个人),如下图: 然后拉到最下面,我下 ...

  2. ConcurrentModificationException 集合并发修改异常 解决

    import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合, ...

  3. Django商城项目笔记No.10用户部分-登录接口

    Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...

  4. PyQt5--Signal&Slot

    # -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...

  5. 小米3系统计算器自己定义开关控件-MySwitchView

    1.前言             在android4.0以后,有switch控件.相似于iPhone上面滑块的效果.可是仅仅能用在4.0以后的系统中.之前的平台.就无法使用这种控件. 近段时间.看到了 ...

  6. 【转】Android Camera 相机开发详解

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...

  7. 【转】 python中 * 的用法

    转自:https://www.cnblogs.com/jony7/p/8035376.html 1.表示乘号 2.表示倍数,例如: def T(msg,time=1):    print((msg+' ...

  8. [转]OPENCV3.3+CUDA9.0 环境搭建若干错误总结

    编译OpenCV设计启用OpenGL三维可视化支持和启用GPU CUDA并行加速处理的基本知识: 1.从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL,这就意味着在OpenCV中可以轻 ...

  9. OpenCV——霍夫变换(直线检测、圆检测)

    x #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namesp ...

  10. Jquery分页组件

    最近工作不是很忙,所以就看看淘宝kissy分页组件源码,感觉代码也不怎么难 容易理解,所以就按照他们的思路自己重新理一遍,来加深自己对他们的理解,同时对他们的分页组件进行一些重构(因为他们分页是做好了 ...