• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

顺序表-Go语言实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

简单理解就是数组;

优缺点及使用场景

优点:

  • 随机访问,在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)
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go-GTKgo版GTK环境搭建发布时间:2022-07-10
下一篇:
ATourofGo:Exercise:Fibonacciclosure发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap