顺序表-Go语言实现
简单理解就是数组;
优缺点及使用场景
优点:
随机访问,在O(1)时间内找到第i个元素;
数据表中的数据是连续存放的,因此只要知道数据表中第一个元素的地址,那么后面的数据元素的地址就可以马上算出来。
存储密度高,每个节点只存储数据元素本身;
无需为表中元素之间的逻辑关系添加额外的存储空间;
缺点:
扩展容量不方便;
静态分配不能拓展容量;即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高;
插入、删除操作不方便,需要移动大量元素
️:尾插效率高!
使用场景:
- 存储密度高;
- 对头,中插入删除操作不频繁,可对尾频繁插入,删除;
- 创建顺序表之前需要对MaxSize有合理预估;
常用操作
顺序表结构,一般有:表体、描述(如length);
const MaxSize int = 100
type SeqList struct {
data []int
length int
}
插入:把插入位置i之后的所有元素往后移再插入;
//InsertList 把value插入第i位置,i-1为index;i从1开始
func (s *SeqList) InsertList(value, i int) error {
if i < 1 || i > s.length+1 {
return errors.New("error insert location")
}
for j := s.length; j >= i-1; j-- {
s.data[j] = s.data[j-1]
}
s.data[i-1] = value
s.length++
return nil
}
删除:把删除位置i之后的所有元素往前移,覆盖掉原来第i个;
//DeleteList 删除第i个
func (s *SeqList) DeleteList(i int) error {
if i < 1 || i > s.length {
return errors.New("delete error location")
}
for j := i; j < s.length; j++ {
s.data[j-1] = s.data[j]
}
s.length--
return nil
}
Golang实现
package main
import (
"errors"
"fmt"
)
const MaxSize int = 100
type SeqList struct {
data []int
length int
}
//NewSeqList 声明并初始化顺序表,为顺序表分配内存空间;
func NewSeqList() *SeqList {
if MaxSize == 0 {
return nil
}
return &SeqList{
data: make([]int, MaxSize, MaxSize),
length: 0,
}
}
//CreateList 给表里添加初始元素
func (s *SeqList) CreateList(data []int, n int) error {
if n > MaxSize {
return errors.New("表长不足")
}
for i, value := range data {
s.data[i] = value
}
s.length = n
return nil
}
//InsertList 把value插入第i位置,i-1为index;i从1开始
func (s *SeqList) InsertList(value, i int) error {
if i < 1 || i > s.length+1 {
return errors.New("error insert location")
}
for j := s.length; j >= i-1; j-- {
s.data[j] = s.data[j-1]
}
s.data[i-1] = value
s.length++
return nil
}
//DeleteList 删除第i个
func (s *SeqList) DeleteList(i int) error {
if i < 1 || i > s.length {
return errors.New("delete error location")
}
for j := i; j < s.length; j++ {
s.data[j-1] = s.data[j]
}
s.length--
return nil
}
func main() {
seqList := NewSeqList()
initDate := []int{0, 1, 2, 3, 4, 5, 6}
err := seqList.CreateList(initDate, len(initDate))
if err != nil {
fmt.Println(err)
}
seqList.InsertList(10, 2)
seqList.SeqListPrint()
seqList.DeleteList(2)
seqList.SeqListPrint()
}
//SeqListPrint 答应顺序表
func (s *SeqList) SeqListPrint() {
fmt.Println("-------------------")
fmt.Print("data: ")
for i := 0; i < s.length; i++ {
fmt.Printf("%v ", s.data[i])
}
fmt.Println()
fmt.Println("length: ", s.length)
}
顺序表-Go语言实现的更多相关文章
- 数据结构与算法之顺序表C语言实现
顺序表等相关概念请自行查阅资料,这里主要是实现. 注: 1.顺序表C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简单函数,可自行添加功能: 4.可用C+ ...
- 顺序表C语言版
#include <stdio.h> /* * 顺序表最多输入N个数 */ #define N 10 #define OK 1 #define ERROR -1 struct sequeu ...
- 线性表之顺序表(C语言实现)
线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...
- 顺序表-C语言实现
顺序存储线性表的结构体: #define MAXSIZE 100 //数组最大长度 typedef int ElemType; //元素类型 typedef struct //定义线性表结构体 { E ...
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- C语言实现顺序表
C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...
- c语言进阶12-线性表之顺序表
一. 线性表的定义 为什么要学习线性表呢? 因为我们日常生活中存在种数据关系,计算机程序是为了解决日常生活的数据关系,因此我们要学习线性表. 线性表是什么呢? 线性表是由n个元素组成的有限序列. 需 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
随机推荐
- CF946B Weird Subtraction Process 题解
Content 有两个数 \(a,b\),执行如下操作: 如果 \(a,b\) 中有一个数是 \(0\),结束操作,否则跳到操作 \(2\). 如果 \(a\geqslant 2b\),那么 \(a\ ...
- LuoguP7375 [COCI2018-2019#5] Jarvis 题解
Content 有 \(n\) 架无人机,每架无人机都有一个当前属性值 \(a_i\) 和出战属性值 \(b_i\).你可以给每架无人机的当前属性值同时加一个数 \(x\)(但只能做一次),使得能够出 ...
- 用相对路径有时居然是这样,,加上<%=basePath%>
用相对路径有时居然是这样,所以还是用绝对路径好点,加上<%=basePath%> 比如create页面的action为ssh/pages/User/create,那么create页面的上的 ...
- CentOS7学习笔记(六) 用户权限管理
用户.用户组与文件的关系 在了解权限管理之前先创建一些用户和用户组便于后续学习,在root用户下操作: # 创建两个用户组 [root@localhost data]# groupadd kaifa ...
- UDP&串口调试助手用法(3)
发送参数配置 下面以 UDP 通道为例介绍 发送数据配置 概览 选择数据源 文件: 选择发送的文件 源码: 自己手动键入发送数据,默认输入的为16进制数据, 定时器发送周期 单位为毫秒. 发送帧计数 ...
- 【LeetCode】1400. 构造 K 个回文字符串 Construct K Palindrome Strings
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计奇数字符出现次数 日期 题目地址:https:// ...
- 【LeetCode】513. Find Bottom Left Tree Value 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS Date 题目地址:https:// ...
- 【LeetCode】875. Koko Eating Bananas 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...
- 基于MCRA-OMLSA的语音降噪(二):实现
上篇文章(基于MCRA-OMLSA的语音降噪(一):原理)讲了基于MCRA-OMLSA降噪的原理,本篇讲怎么做软件实现.软件实现有多种方式.单纯看降噪效果可用python,因为python有丰富的库可 ...
- ZFNet: Visualizing and Understanding Convolutional Networks
目录 论文结构 反卷积 ZFnet的创新点主要是在信号的"恢复"上面,什么样的输入会导致类似的输出,通过这个我们可以了解神经元对输入的敏感程度,比如这个神经元对图片的某一个位置很敏 ...