顺序表-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语言 编写的顺序表的 ...
随机推荐
- 显示大纲数字(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 话说摘要任务,给人的感觉,就像Word里的大纲级别,可我也知道,好多同学不习惯用大纲级别,而是偏爱用编号级别,最常见的也就 ...
- CF1560D Make a Power of Two 题解
Content 给定一个整数 \(n\).每次操作你可以做两件事情中的一件: 删去这个数中的一个数位(如果这个数只剩下一位,则可以把它删空). 在这个数的右边添加一个数位. 你可以以任意顺序执行无限次 ...
- vc++ 调用winapi调节屏幕亮度
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist ---- 已经更正文章中错误的地方, 时间: 10/10/2020--------- 自己封 ...
- GCD (hdu 5726)
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- Docker 与 K8S学习笔记(四)—— Dockerfile的编写
在上一篇中我们简单介绍了Docker镜像的获取与使用,其中在镜像制作中提到在实际使用中一定要用Dockerfile方式去创建镜像而不要用docker commit方式,那么我们该如何编写Dockerf ...
- 使用.NET 6开发TodoList应用(10)——实现DELETE请求以及HTTP请求幂等性
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 先说明一下关于原本想要去更新的PATCH请求的文章,从目前试验的情况来看,如果是按照.NET 6的项目结构(即只使用一个Pro ...
- 业务层面和运维层面优化你的Redis
业务层面 key的长度尽量要短,在数据量非常大时,过长的key名会占用更多的内存; 一定避免存储过大的数据(大value),过大的数据在分配内存和释放内存时耗时严重,会阻塞主线程; Redis 4.0 ...
- 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法
第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...
- [Opencv]几种对轮廓的处理方式
boundingRect() 作用:计算点集的右上边框. 形式:boundingRect(InputArray points): 参数:points:输入二维点集,并用std::vector or M ...
- 动态规划题 HDU-1024
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Now I think you have got an AC in Ignatius.L's " ...