Go语言-数据结构-线性表
目录
1.顺序表-线性表顺序存储结构
1.1顺序表结构体定义
1.2顺序表初始化创建
1.3顺序表查找元素k第一次出现时的下标
1.4顺序表插入元素
1.5顺序表删除元素
1.6最终代码和实现效果
2.单向链表-线性表链式存储结构
2.1单向链表的定义
2.2单向链表的初始化创建
2.3单向链表插入元素
2.4单向链表删除元素
2.5查询索引位置i的数据
2.6查询K值第一次出现时所在的索引位置
2.7最终代码实现和效果
线性表的抽象数据类型描述
数据对象集:线性表是n(>=0)个元素构成的有序序列。
操作集:
- 初始化一个空线性表;
- 根据位序K,返回相应元素;
- 在线性表中查找X的第一次出现的位置;
- 在指定位置插入元素;
- 在指定位置删除元素;
- 返回线性表的长度;
1.顺序表-线性表顺序存储结构
1.1顺序表结构体定义
type SeqList struct {data []intmaxSize int //最大长度length int //当前长度
}
1.2顺序表初始化创建
func initSeqList(maxSize int) (list *SeqList) {var data []intlist = &SeqList{data: data,maxSize: maxSize,length: 0,}return list
}
1.3顺序表查找元素k第一次出现时的下标
func (sl *SeqList) find(k int) (int, error) {i := 0for sl.maxSize != i && sl.data[i] != k {i++}if sl.maxSize == i {return -1, errors.New("没有查到")} else {return i, nil}
}
1.4顺序表插入元素
在下标为i的位置插入元素
func (sl *SeqList) insert(i int, v int) error {if sl.maxSize == sl.length {return errors.New("线性表元素已满")}if i < 0 || i >= sl.maxSize {return errors.New("下标位置不合法")}if i == sl.length { //i的位置在最后时或者线性表中没有元素时sl.data[i] = vsl.length++} else {for j := sl.length - 1; j >= i; j-- {sl.data[j+1] = sl.data[j]}sl.data[i] = vsl.length++}return nil
}
1.5顺序表删除元素
在下标为i的位置删除元素
func (sl *SeqList) delete(i int) error {if sl.length == 0 {return errors.New("线性表为空")}if i < 0 || i >= sl.maxSize {return errors.New("下标位置不合法")}if i == sl.length { //i的位置在最后时或者线性表中没有元素时sl.length--sl.data = append(sl.data[:sl.length-1])} else {for j := i; j < sl.length-1; j++ {sl.data[j] = sl.data[j+1]}sl.length--sl.data = append(sl.data[:sl.length-1])}return nil
}
1.6最终代码和实现效果
package mainimport ("errors""fmt"
)type SeqList struct {data []intmaxSize int //最大长度length int //当前长度
}func main() {list1 := initSeqList(10)fmt.Println("初始化线性表:", *list1)//顺序插入for i := 0; i < 6; i++ {err := list1.insert(i, i)if err != nil {fmt.Println(err.Error())}fmt.Println("顺序插入值后的线性表:", *list1)}//中间插入err := list1.insert(1, 100)if err != nil {fmt.Println(err.Error())}fmt.Println("中间插入值后的线性表:", *list1)index1, err := list1.find(4)if err != nil {fmt.Println(err.Error())}fmt.Println("4的值在索引:", index1)err = list1.delete(3)if err != nil {fmt.Println(err.Error())}fmt.Println("删除索引后的线性表:", *list1)
}func initSeqList(maxSize int) (list *SeqList) {var data []intlist = &SeqList{data: data,maxSize: maxSize,length: 0,}return list
}func (sl *SeqList) find(k int) (int, error) {i := 0for sl.maxSize != i && sl.data[i] != k {i++}if sl.maxSize == i {return -1, errors.New("没有查到值相同的元素")} else {return i, nil}
}func (sl *SeqList) insert(i int, v int) error {if sl.maxSize == sl.length {return errors.New("线性表元素已满")}if i < 0 || i >= sl.maxSize {return errors.New("下标位置不合法")}if i == sl.length { //i的位置在最后时或者线性表中没有元素时sl.data = append(sl.data, v)sl.length++} else {sl.data = append(sl.data, 0) //切片最后append加入站位for j := sl.length - 1; j >= i; j-- {sl.data[j+1] = sl.data[j]}sl.data[i] = vsl.length++}return nil
}func (sl *SeqList) delete(i int) error {if sl.length == 0 {return errors.New("线性表为空")}if i < 0 || i >= sl.maxSize {return errors.New("下标位置不合法")}if i == sl.length { //i的位置在最后时或者线性表中没有元素时sl.length--sl.data = append(sl.data[:sl.length-1])} else {for j := i; j < sl.length-1; j++ {sl.data[j] = sl.data[j+1]}sl.length--sl.data = append(sl.data[:sl.length-1])}return nil
}
2.单向链表-线性表链式存储结构
无头节点的单向链表
有头节点的单向链表
2.1单向链表的定义
LinkNode结构体定义链表的节点。
LinkList结构体定义链表的头节点和链表长度,链表头节点其实就是LinkNode。
type LinkNode struct {data intnext *LinkNode
}type LinkList struct {head *LinkNodelength int
}
2.2单向链表的初始化创建
初始化一个有头节点的单向链表
func initLinkList() (linkList *LinkList) {linkList = &LinkList{head: &LinkNode{data: -1,next: nil,},length: 0,}return linkList
}
2.3单向链表插入元素
在下标为i的位置插入元素
func (ll *LinkList) insert(i int, v int) error {if i < 0 {return errors.New("索引位置不合法")} else if i > ll.length {return errors.New("插入位置超出链表长度")}//创建需要新增的节点newNode := &LinkNode{data: v,next: nil,}tmpNode := ll.headtmpIndex := 0//获取要插入位置的前一个节点for tmpNode != nil && tmpIndex < i {tmpNode = tmpNode.nexttmpIndex++}newNode.next = tmpNode.next //新节点的next,指向原索引位置为i的元素tmpNode.next = newNode //原索引位置i-1的元素的nex,指向新节点ll.length++ //链表长度+1return nil
}
2.4单向链表删除元素
删除下标为i的元素
func (ll *LinkList) delete(i int) error {if i < 0 {return errors.New("索引位置不合法")} else if i >= ll.length {return errors.New("插入位置超出链表长度")} else if ll.length == 0 {return errors.New("链表为空")}tmpNode := ll.head//获取要插入位置的前一个节点for tmpIndex := 0; tmpIndex < i; tmpIndex++ {tmpNode = tmpNode.next}//获取要删除位置节点indexNode := tmpNode.nexttmpNode.next = indexNode.next //将索引位置i-1节点的指针指向索引位置i+1节点indexNode.next = nil //将要删除的节点指针清空ll.length-- //链表长度-1return nil
}
2.5查询索引位置i的数据
func (ll *LinkList) searchIndex(i int) (int, error) {if i < 0 {return -1, errors.New("索引位置不合法")} else if i >= ll.length {return -1, errors.New("插入位置超出链表长度")} else if ll.length == 0 {return -1, errors.New("链表为空")}tmpNode := ll.headfor tmpIndex := 0; tmpIndex <= i; tmpIndex++ {tmpNode = tmpNode.next}return tmpNode.data, nil
}
2.6查询K值第一次出现时所在的索引位置
func (ll *LinkList) searchValue(k int) (int, error) {i := 0tmpNode := ll.headfor ll.length != i && tmpNode.data != k {i++}if ll.length == i {return -1, errors.New("没有查到值相同的元素")} else {return i, nil}
}
2.7最终代码实现和效果
package mainimport ("errors""fmt"
)type LinkNode struct {data intnext *LinkNode
}type LinkList struct {head *LinkNodelength int
}func main() {linkList1 := initLinkList()//插入数据linkList1.insert(0, 100)linkList1.insert(1, 200)linkList1.insert(0, 1)v1, _ := linkList1.searchIndex(0)fmt.Println("索引为0的位置的值:", v1)v2, _ := linkList1.searchIndex(2)fmt.Println("索引为2的位置的值:", v2)v3, _ := linkList1.searchValue(100)fmt.Println("值为100时的索引位置:", v3)fmt.Println("---删除索引位置0的节点---")linkList1.delete(0)v4, _ := linkList1.searchIndex(0)fmt.Println("索引为0的位置的值:", v4)
}func initLinkList() (linkList *LinkList) {linkList = &LinkList{head: &LinkNode{data: -1,next: nil,},length: 0,}return linkList
}func (ll *LinkList) insert(i int, v int) error {if i < 0 {return errors.New("索引位置不合法")} else if i > ll.length {return errors.New("插入位置超出链表长度")}//创建需要新增的节点newNode := &LinkNode{data: v,next: nil,}tmpNode := ll.headtmpIndex := 0//获取要插入位置的前一个节点for tmpNode != nil && tmpIndex < i {tmpNode = tmpNode.nexttmpIndex++}newNode.next = tmpNode.next //新节点的next,指向原索引位置为i的元素tmpNode.next = newNode //原索引位置i-1的元素的nex,指向新节点ll.length++ //链表长度+1return nil
}func (ll *LinkList) delete(i int) error {if i < 0 {return errors.New("索引位置不合法")} else if i >= ll.length {return errors.New("插入位置超出链表长度")} else if ll.length == 0 {return errors.New("链表为空")}tmpNode := ll.head//获取要插入位置的前一个节点for tmpIndex := 0; tmpIndex < i; tmpIndex++ {tmpNode = tmpNode.next}//获取要删除位置节点indexNode := tmpNode.nexttmpNode.next = indexNode.next //将索引位置i-1节点的指针指向索引位置i+1节点indexNode.next = nil //将要删除的节点指针清空ll.length-- //链表长度-1return nil
}func (ll *LinkList) searchValue(k int) (int, error) {i := 0tmpNode := ll.head.nextfor i < ll.length && tmpNode.data != k {tmpNode = tmpNode.nexti++}if ll.length == i {return -1, errors.New("没有查到值相同的元素")} else {return i, nil}
}func (ll *LinkList) searchIndex(i int) (int, error) {if i < 0 {return -1, errors.New("索引位置不合法")} else if i >= ll.length {return -1, errors.New("插入位置超出链表长度")} else if ll.length == 0 {return -1, errors.New("链表为空")}tmpNode := ll.headfor tmpIndex := 0; tmpIndex <= i; tmpIndex++ {tmpNode = tmpNode.next}return tmpNode.data, nil
}
Go语言-数据结构-线性表相关推荐
- c语言数据结构线性表LA和LB,数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合?...
数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合? 数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15 ...
- C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文
数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00 浏览量:763 手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...
- C语言数据结构线性表顺序存储结构(插入、删除、获取)
一.代码 #include<stdio.h> #define MAXSIZE 20 /*存储空间初始分配量*/ #define OK 1 #define ERROR 0//元素数据类型,假 ...
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)
[简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT List { 数据 ...
- 数据结构(C语言)——线性表(定义,基本操作)
数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...
- 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码
数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...
- c语言构造一个空线性表l,数据结构线性表顺序结构的定义与实现C语言-Go语言中文社区...
大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式.在 ...
最新文章
- 语言解决猜神童年龄的问题_一个程序设计题目猜年龄(不限程序语言)
- 分享笔趣阁、宜搜等小说免费API接口
- Google Play 关联了
- java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
- request重定向_golang不想http自动处理重定向的解决方案
- 《SuperMap GIS二次开发MVC实战训练---江海区慢性病防治院系统》项目研发阶段性总结
- 再把鼻子涂黑的飞鸽沟通最简单
- VUE-PDF VUE的PDF预览组件
- linux mint 自动更新设置,如何升级到Linux Mint 19.1
- Ubuntu 14.04 Ruby 2.3.3 安装
- python项目练手(一)------飞船大战游戏
- MP4Box切割mp4视频文件
- xml文件中servlet映射重复问题,也是导致tomcat启动不了,出现在Java 9上运行时,需在JVM命令行参数中添加“-add opens=Java.base/Java.lang=ALL-U
- mac os vs windows(于前端开发而言)
- 投诉百度快照对排名的影响
- 节能与环保杂志节能与环保杂志社节能与环保编辑部2023年第2期目录
- 您应该知道的:关于应用服务器的配置测算及计算公式
- 云流量成为数据中心的王者
- CentOS7使用firewalld打开关闭防火墙与端口-----------健康之家
- 1、IDEA安装与破解教程
热门文章
- ISTQB基础级认证参考书
- 银河麒麟操作系统开发_银河初级开发者指南
- AFD在CentOS环境中部署
- Kotlin第三章:AndroidUI简介
- 第一章第二题(显示五条消息)(Display five messages)
- (ACWing yxc基础算法课笔记) 前缀和
- 如何获取Certificate fingerprint (SHA1) key 以及 MD5 certification key
- wps表格转换HTML且能修改,怎么把WPS表格文件转换为WPS文字文件?
- 转载 :高中时候想的一个脑洞大开的故事
- github简易教程