目录
前言
最近在学习Go语言,同时在学习计算机基础四大件中的数据结构与算法,但在网上查找资源时,发现大部分数据结构与算法视频、博客等都很少使用Go语言来编写,正好小编在学习,于是决定写一个GO语言版的数据结构与算法系列博客,小编是初学者,很多地方学的可能不是很好,希望各位大佬能够多多指正。
提示:以下是本篇文章正文内容,下面案例可供参考
一、线性表是什么?
1.定义
线性表,就是有限的数据按照一定的顺序存储的一个序列,其中,除了表头和表尾,表中任一元素都只有一个直接前驱和一个直接后继。
2.存储结构
线性表分为顺序存储结构和链式存储结构,其中
顺序存储结构:便于查找,但插入和删除比较麻烦
链式存储结构:插入删除较为容易,但查找比较复杂
二、线性表的实现
1.顺序表
1.1.1 顺序表的结构定义
const MaxSize = 100
type sqList struct{
data [MaxSize]int // 用去存储顺序表数据
length int
}
1.1.2 顺序表的初始化
func initSqlist()*sqList{
var data [MaxSize]int
return &sqList{
data:data,
length:0,
}
}
1.1.3 判断空表
func (s *sqList)isValid()bool{
if s.length == 0{
return true
}
return false
}
1.1.4 顺序表的插入
- 思路:考虑到顺序表的存储结构在内存中是一块连续的内存,因此我们只要找到需要插入元素的位置,然后将该位置及其后面的元素依次往后移一位即可
- 当然,我们在往顺序表插入元素时,首先要判断插入位置是否合法化,线性表中的元素是按一定顺序排列的序列,不能说想插在哪个位置就插在哪个位置。其次,如果顺序表满了,我们就不能继续插入了(可以选择扩容,但这里不展示)
- 顺序表插入的思路如图所示
- 代码实现如下:
// 将元素插入在第index个位置,时间复杂度为O(n)
func (s *sqList)insert(data int,index int)error{
if index < 0 || index > s.length { // 判断索引值是否合法
return errors.New("please input the right index\n")
return
}
if s.length == MaxSize{ // 判断是否队满
return errors.New("the list is full,can not insert\n")
return
}
for i:= s.length-1;i>=index;i--{ // 将插入位置及以后的元素依次后移
s.data[i+1] = s.data[i]
}
s.data[index] = data // 在插入位置插入元素
s.length++
return nil
}
1.1.5 顺序表的删除
- 思路:与顺序表插入的操作相反,在进行删除操作时,我们首先得找到删除元素的位置,然后将其之后的元素依次向前移动一个位置,这样要删除的元素就会被覆盖掉,达到了删除该元素的目的。
- 同样,删除时也要判断索引值是否合法,另外,如果顺序表为空,则没有元素可以删除。
- 顺序表删除思路如图所示:
- 代码实现如下: