线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据。

单链表:每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,依次相连,形成链表。特别注意的是每个链表必须包含头结点(数据域一般无意义或者为空,有时用来存储链表长度等等)

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

// 单链表:
package main import "fmt" // 创建节点结构/类型
type Node struct {
Data interface{}
Next *Node
} // 创建链表结构
type LList struct {
Head *Node
Length int // 这里的链表长度不计入头节点
} // a.设计接口:
type Method interface {
Insert(i int, v interface{}) // 增
Delete(i int) // 删
GetLength() int // 获取长度
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.基于链表结构体实现接口 Method 中的方法:
// 在 i 处插入节点(前插??——即插入到原来的第 i 个节点之前,成为现在的第 i 个节点)
func (list *LList) Insert(i int, v interface{}) {
s := CreateNode(v)
pre := list.Head
for count:=0; count<=i; 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 {
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.Next
fmt.Println("LList shows as follows: ...")
for i:=1; i<=list.Length;i++ {
fmt.Printf("%v\n", pre.Data)
pre = pre.Next
}
} // 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)
} 打印结果:
List is null: true
LList shows as follows: ...
5
3
6
List length is: 3
元素6在位置: 3
元素100在位置: 0
List is null: false
LList shows as follows: ...
5
6
List length is: 2

 

go语言实现单链表的更多相关文章

  1. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  2. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  3. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  4. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  5. C/C++语言实现单链表(带头结点)

    彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...

  6. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  7. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  8. C语言实现单链表(不带头结点)节点的插入

    对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...

  9. C语言实现单链表(带头节点)

    C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...

  10. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

随机推荐

  1. 2019 SDN上机第一次实验作业

    1. 安装轻量级网络仿真工具Mininet 先从GitHub上获取mininet源码,再输入命令进行安装,代码分别如下: git clone https://github.com/mininet/mi ...

  2. python:如何获取当前的日期和时间

    # coding=utf-8 import datetime import time print ("格式参数:") print (" %a 星期几的简写") ...

  3. NTC3950-10K温度传感器

    一.计算公式 补充: B=3950 R=10K T2=25度 查RT表,25度对应的是10K 电路: 热敏电阻与上拉电阻R813分压,获取温度与Vo电压的关系,在根据Vo折算出与MCU ADC的数值. ...

  4. Spring IOC的缓存

    1.将上一篇的测试代码修改如下 public class SpringTest { public static void main(String[] args) { ClassPathResource ...

  5. DialogFragment: DialogFragment的一些理解

    Android 自3.0版本引入了DialogFragment这个类,并推荐开发者使用这个类替代之前经常使用的Dialog类,那么DialogFragment相对于之前的Dialog究竟有什么优势呢? ...

  6. linux 中 scp 命令

    scp命令用于Linux 之间复制文件和目录.如果想在windows 环境中使用需要安装 linux 命令环境,比如 cmder scp是 secure copy的缩写, scp是linux系统下基于 ...

  7. ionic4.x网络请求

    创建common服务: import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/ ...

  8. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

  9. 基于Source Insight_Scan的C/C++静态代码检查工具安装说明

    基于Source Insight_Scan的C/C++静态代码检查工具安装说明   本文链接:https://blog.csdn.net/M19930517/article/details/79977 ...

  10. Laya的资源加载

    白鹭中的资源加载,可以单个去加载.但是更多是通过资源组加载的. 比如进入登录界面,则加载登录资源组的资源.销毁登录界面,则卸载登录模资源. //加载登录模块资源组 RES.loadGroup(&quo ...