顺序表基本参数

定义顺序表的容量

const MaxSize = 50 			// 顺序表的容量为50

定义元素的数据类型

type ElemType = int			// 创建一个类型别名,需要存储其他类型时可以直接更改

定义顺序表的底层结构

type SqList struct{
	elem [MaxSize]ElemType	// 顺序表用来存储元素的数组,长度为MaxSize
    length int				// 顺序表的长度,即当前存储的元素个数
}

顺序表的工具方法

初始化顺序表

func InitSqList()*SqList{
    return new(SqList)		// 返回一个指向空顺序表的指针
}

获取顺序表当前长度

func (l SqList) GetLength() int {
	return l.length			// 直接返回顺序表的长度
}

判断顺序表是否为空

func (l SqList) IsEmpty() bool {
	return l.length == 0 	// 判断顺序表的长度是否等于0
}

判断顺序表是否为满

func (l SqList) IsFull() bool {
	return l.length == MaxSize // 判断顺序表的长度是否等于MaxSize
}

打印顺序表中的所有元素

// PrintBySlice 以切片的形式打印所有元素
func (l SqList) PrintBySlice() {
    end := l.GetLength()	  // 获取当前顺序表的长度
    fmt.Println(l.elem[:end]) // 以切片的形式打印所有元素
}

顺序表的插入操作

在尾部插入元素

// InsertHead 在顺序表中的尾部位置插入元素
// elem 待插入的元素
func (l *SqList) InsertTail(elem ElemType) bool {
	//1.判断当前顺序表是否存满
	if full := l.IsFull(); full {
		return false
	}
	//2.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//3.在尾部插入新元素
	l.elem[lastIndex+1] = elem
	//4.顺序表的长度增1
	l.length++
	//5.返回操作结果
	return true
}

//调用Insert方法实现
func (l *SqList) InsertTail(elem ElemType) bool {
	locIndex := l.GetLength()
	return l.Insert(locIndex, elem) //插入位置固定为最后一个元素后
}

在头部插入元素

// InsertHead 在顺序表中的头部位置插入元素
// elem 待插入的元素
func (l *SqList) InsertHead(elem ElemType) bool {
	//1.判断当前顺序表是否存满
	if full := l.IsFull(); full {
		return false
	}
	//2.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//3.从最后一个元素开始,遍历到第一个元素结束(包括第一个元素),均向后移动一个位置
	for i := lastIndex; i >= 0; i-- {
		l.elem[i+1] = l.elem[i]
	}
	//3、将新元素插入到第一个位置
	l.elem[0] = elem
	//4、顺序表的长度增1
	l.length++
	//5、返回操作结果
	return true
}

//调用Insert方法实现
func (l *SqList) InsertHead(elem ElemType) bool {
    return l.Insert(1,elem)	//插入位置固定为1
}

在指定位置插入元素

// Insert 在顺序表中的指定位置插入元素
// loc 目标位置
// elem 待插入的元素
func (l *SqList) Insert(loc int, elem ElemType) bool {
	//1.判断当前顺序表是否存满
	if full := l.IsFull(); full {
		return false
	}
	//2.判断目标位置loc是否合法
	if loc < 1 || loc > l.length+1 {
		return false
	}
	//3.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//4.从最后一个元素开始,向前遍历到插入位置元素结束(包括插入位置),均向后移动一个位置
	for i := lastIndex; i >= locIndex; i-- {
		l.elem[i+1] = l.elem[i]
	}
	//4.获取目标位置loc的下标
    locIndex := loc - 1
    //5.在目标位置插入元素
	l.elem[locIndex] = elem
	//6.顺序表的长度增1
	l.length++
	//7.返回操作结果
	return true
}

顺序表的删除操作

在尾部删除元素

// DeleteTail 在顺序表尾部位置删除元素
func (l *SqList) DeleteTail() bool {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty();empty{
		return false
	}
	//2.顺序表的长度减1
	l.length--
	//3.返回操作结果
	return true
}

// DeleteAndReturnTail 在顺序表尾部位置删除元素并返回删除的元素
func (l *SqList) DeleteAndReturnTail() (ElemType, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//3.记录最后一个元素的值
	lastElem := l.elem[lastIndex]
	//4.顺序表的长度减1
	l.length--
	//5.返回操作结果
	return lastElem, true
}

在头部删除元素

// DeleteHead 在顺序表头部删除元素
func (l *SqList) DeleteHead() bool {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return false
	}
	//2.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//3.从第二个元素开始,向后遍历到最后一个元素结束(包括最后一个元素),均向前移动一个位置
	for i := 1; i <= lastIndex; i++ {
		l.elem[i-1] = l.elem[i]
	}
	//4.顺序表长度-1
	l.length--
	//5.返回操作结果
	return true
}

// DeleteAndReturnHead 在顺序表头部删除元素并返回删除的元素
func (l *SqList) DeleteAndReturnHead() (ElemType, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.记录第一个元素的值
	firstElem := l.elem[0]
	//3.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//4.从第二个元素开始,遍历到最后一个元素结束(包括最后一个元素),均向前移动一个位置
	for i := 1; i <= lastIndex; i++ {
		l.elem[i-1] = l.elem[i]
	}
	//5.顺序表长度-1
	l.length--
	//6.返回操作结果
	return firstElem, true
}

删除指定位置元素

// Delete 删除指定位置上的元素
// loc 目标位置
func (l *SqList) Delete(loc int) bool {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return false
	}
	//2.判断目标位置是否合法
	if loc < 1 || loc > l.length {
		return false
	}
	//3.获取目标位置的下标
	locIndex := loc - 1
	//4.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//5.从目标位置的下一个位置的下标开始,向后遍历到最后一个元素的下标结束(包括最后一个元素),均向前移动一个位置
	for i := locIndex + 1; i <= lastIndex; i++ {
		l.elem[i-1] = l.elem[i]
	}
	//6.顺序表长度-1
	l.length--
	//7.返回操作结果
	return true
}

// DeleteAndReturn 删除指定位置上的元素并返回删除的元素
func (l *SqList) DeleteAndReturn(loc int) (ElemType, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.判断目标位置是否合法
	if loc < 1 || loc > l.length {
		return -1, false
	}
	//3.获取目标位置的下标
	locIndex := loc - 1
	//4.记录目标位置元素的值
	locElem := l.elem[locIndex]
	//5.获取最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//6.从目标位置的下一个位置的下标开始,向后遍历到最后一个元素的下标结束(包括最后一个元素),均向前移动一个位置
	for i := locIndex + 1; i <= lastIndex; i++ {
		l.elem[i-1] = l.elem[i]
	}
	//7.顺序表长度-1
	l.length--
	//8.返回操作结果
	return locElem, true
}

顺序表的修改操作

修改指定位置元素

// Update 修改指定位置上元素的值
// loc 目标位置
// elem 修改后的值
func (l *SqList) Update(loc int, elem ElemType) bool {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return false
	}
	//2.判断目标位置是否合法
	if loc < 1 || loc > l.length {
		return false
	}
	//3.获取目标位置的下标
	locIndex := loc - 1
	//4、在目标位置修改元素
	l.elem[locIndex] = elem
	//5、返回操作结果
	return true
}

// UpdateAndReturn 修改指定位置上元素的值并返回修改前的值
func (l *SqList) UpdateAndReturn(loc int, elem ElemType) (ElemType, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.判断目标位置是否合法
	if loc < 1 || loc > l.length {
		return -1, false
	}
	//3.获取目标位置的下标
	locIndex := loc - 1
    //4.记录目标位置元素的值
    locElem := l.elem[locIndex]
	//5、在目标位置修改元素
	l.elem[locIndex] = elem
	//6、返回操作结果
	return locElem, true
}

顺序表的查找操作

// GetIndex 根据指定元素查找元素的位置
// elem 待查找的元素
func (l SqList) GetLocat(elem ElemType) (int, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.最后一个元素的下标
	lastIndex := l.GetLength() - 1
	//3.遍历顺序表
	for i := 0; i <= lastIndex; i++ {
		if l.elem[i] == elem {
			return i + 1, true
		}
	}
	return -1, false
}

// GetElem 根据指定的位置查找元素
// loc 目标位置
func (l SqList) GetElem(loc int) (ElemType, bool) {
	//1.判断当前顺序表是否为空
	if empty := l.IsEmpty(); empty {
		return -1, false
	}
	//2.判断目标位置是否合法
	if loc < 1 || loc > l.length {
		return -1, false
	}
	//3.获取目标位置的下标
	locIndex := loc - 1
	//4.获取目标位置的元素
	locElem := l.elem[locIndex]
	//5.返回操作结果
	return locElem, true
}