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. 学习python 第一章

    目录 第一章... 1 1:新建项目... 1 2:修改默认模板... 3 3:什么是变量... 3 4:重指向... 3 5:常量的表示... 4 6:格式化输出(三种方法)... 4 7:打印一个 ...

  2. Rafy框架

    l  什么是Rafy框架? -------- Rafy 是一个面向企业级开发的插件化快速开发框架. l  Rafy的优点是什么? ------快速开发.产品线工程.一套代码可同时生成并运行 C/S.单 ...

  3. ubuntu各类问题笔记

    ubuntu文本编辑器中文中文乱码问题解决 转载自:http://www.2cto.com/os/201201/117535.html 缺省配置下,用Ubuntu 的文本编辑器(gedit)打开GB1 ...

  4. redis 配置文件示例

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k  => 1000 bytes# 1kb =& ...

  5. python3: 迭代器与生成器(1)

    1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...

  6. Spring Boot 验证表单

    在实际工作中,得到数据后的第一步就是验证数据的正确性,如果存在录入上的问题,一般会通过注解校验,发现错误后返回给用户,但是对于逻辑上的错误,很难使用注解方式进行验证了,这个使用可以使用Spring所提 ...

  7. 团队作业7——第二次项目冲刺(Beta版本)day3

    项目成员:  曾海明(组长):201421122036 于波(组员):201421122058 蓝朝浩(组员):201421122048 王珏 (组员):201421122057 叶赐红(组员):20 ...

  8. jQuery 实现复选框的全选与反选

    <script> //实现全选与反选 $(".allAndNotAll").click(function () { if ($(this).prop("che ...

  9. 开源http协议库curl和wget的区别和使用

    curl和wget基础功能有诸多重叠,如下载等. 在高级用途上的curl由于可自定义各种请求参数所以长于模拟web请求,用于测试网页交互(浏览器):wget由于支持ftp和Recursive所以长于下 ...

  10. mysql安装,oracle安装

    mysql 版本:5.5.20 直接是是是装完, 密码设为123456, 检查服务, 然后装navicat 32位,64位均可,连接时输入root,123456. 连接成功!为所欲为操作数据库. ht ...