Personal Blog

数据结构

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