数据结构
02-顺序表实现
顺序表
之前提到过,顺序表通过Go中的数组或切片来作为存储的组织形式即可。这里我们采用切片来 实现。
类型的定义
将切片(slice)放到一个结构体中即可
type SequenceList struct {
data []any // 为了操作方便,这里使用的是go中的切片类型,而非数组类型
}
对线性表接口的实现
前面列出了线性表的基础操作,这里会对其一一进行实现,但是在实现任何一个方法前,我 们需要先实现其初始化方法。
0. NewSequenceList
//初始化
func NewSequenceList() *SequenceList {
sl := new(SequenceList)
sl.data = make([]any, 0)
return sl
}
1. ClearList
// 清空线性表中的数据
func (s *SequenceList) ClearList() {
s.data = make([]any, 0)
}
2. IsEmpty
// 判断线性表是否为空表
func (s *SequenceList) IsEmpty() bool {
return len(s.data) == 0
}
3. GetLength
// 获取当前线性表中数据的长度
func (s *SequenceList) GetLength() int {
return len(s.data)
}
4. GetElementByIndex
// 获取线性表中位于指定索引的元素
func (s *SequenceList) GetElementByIndex(index int) (any, error) {
if index >= len(s.data) || index < 0 {
return nil, fmt.Errorf("index out of range")
}
return s.data[index], nil
}
5. GetElementIndexByValue
// 获取线性表中与指定值相等元素的索引
func (s *SequenceList) GetElementIndexByValue(element any) (int, error) {
var index int
for index = 0; index < len(s.data); index++ {
if s.data[index] == element {
return index, nil
}
}
return 0, fmt.Errorf("can't find element %s in data", element)
}
6. GetPriorElement
// 获取线性表中与指定值相等元素的前一个元素
func (s *SequenceList) GetPriorElement(element any) (any, error) {
var index int
if s.data[0] == element {
return 0, fmt.Errorf("element %s has been found, but it's already the first element", element)
}
for index = 1; index < len(s.data); index++ {
if s.data[index] == element {
return s.data[index-1], nil
}
}
return 0, fmt.Errorf("can't find element %s in data", element)
}
7. GetNextElement
// 获取线性表中与指定值相等元素的后一个元素
func (s *SequenceList) GetNextElement(element any) (any, error) {
var index int
for index = 0; index < len(s.data)-1; index++ {
if s.data[index] == element {
return s.data[index+1], nil
}
}
if s.data[index] == element {
return 0, fmt.Errorf("element %s has been found, but it's already the last element", element)
}
return 0, fmt.Errorf("can't find element %s in data", element)
}
8. InsertByIndex
// 在线性表中指定索引处插入元素
// InsertByIndex you can insert element into the list, between head and tail, or you will get over range error
func (s *SequenceList) InsertByIndex(index int, element any) error {
if index >= len(s.data)+1 || index < 0 {
return fmt.Errorf("index is out of range")
}
dataParts := make([]any, 0)
dataParts = append(dataParts, s.data[:index]...)
dataParts = append(dataParts, element)
dataParts = append(dataParts, s.data[index:]...)
s.data = dataParts
return nil
}
9. DeleteByIndex
// 获在线性表中指定索引处删除元素
// DeleteByIndex you can delete element by index, between head and tail, or you will get over range error
func (s *SequenceList) DeleteByIndex(index int) (deletedElement any, err error) {
if index > len(s.data)-1 || index < 0 {
return nil, fmt.Errorf("index is out of range")
}
deletedElement = s.data[index]
if index == len(s.data)-1 {
s.data = s.data[:index]
} else {
s.data = append(s.data[:index], s.data[index+1:]...)
}
return deletedElement, nil
}
10. Traverse
// 遍历打印所有元素
func (s *SequenceList) Traverse() {
fmt.Println("Gonna traverse to print all element:")
for index, value := range s.data {
fmt.Printf(" index: %d, value: %v\n", index, value)
}
}
其他同类文章
DATA-STRUCTURE · CHAPTER02
data structure chapter02
