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. RecyclerView嵌套TextView时显示文字不全的解决方法之一

    先描述一下这个小bug:简单的TextView嵌套RecyclerView作为itemView时,可能会在文本中出现布局覆盖的现象,itemView的布局其实很简单,就是一个RelativeLayou ...

  2. C++设计模式 ==> 装饰(者)模式

    简介 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.装饰模式使用对象嵌套的思想,实现对一个对象动态地进行选择性的属 ...

  3. django复习-1-环境搭建和创建项目

    一.虚拟环境搭建 1. 创建虚拟环境,需要联网 mkvirtualenv django_py3_1.11 -p python3 2. 安装Django 使用django 1.11.11版本,注意需要联 ...

  4. BZOJ5369:[PKUSC2018]最大前缀和(状压DP)

    Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...

  5. Winfrom 使用WCF 实现双工通讯

    实现双工通讯主要分三步. 通信接口的定义: 被调用接口的实现 双工通道的建立 请先引用DLL(CSDN的代码编辑器真尼玛蛋疼) 整个解决方案的结构 1.通信接口的定义: 服务端调用客户端接口IServ ...

  6. myEtherWallet在线钱包的使用

    https://www.myetherwallet.com/#generate-wallet myEtherWallet是一款在线钱包,当你不想安装类似metamask这样的插件时,可以选择使用它 1 ...

  7. mysql 批量修改字段方法

    一.正式环境操作注意事项: .关闭应用访问或者设置数据库只读 mysql设为只读方法: 开启只读: mysql> show global variables like "%read_o ...

  8. leetcode650—2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...

  9. Shell调试篇 转

    检查语法 -n选项只做语法检查,而不执行脚本. sh -n script_name.sh 启动调试 sh -x script_name.sh 进入调试模式后,Shell依次执行读入的语句,产生的输出中 ...

  10. action类型的按钮和object按钮的用法

    <div class="oe_right oe_button_box" name="buttons"> <button class=" ...