package main
import (
"fmt"
)
// Node 线性表结构体
type Node struct {
Data []int
Cap, Size int
}
//初始化线性表
func initVector(cnt int) *Node {
a := new(Node) //动态开辟数组空间
arr := make([]int, cnt, cnt)
a.Data = arr
a.Size = 0
a.Cap = cnt
return a
}
//线性表扩容
func (n *Node) extension(d []int) *Node {
var nCap int
if n.Cap <= 10 {
nCap = 3 * n.Size
} else {
nCap = 2 * n.Size
}
nArr := make([]int, nCap, nCap)
n.Data = nArr
n.Cap = nCap
//将旧值移动到新的数组中
for i := 0; i < len(d); i++ {
n.Data[i] = d[i]
}
return n
}
//getCap 获取容量
func (n *Node) getCap() int {
return n.Cap
}
// getSize 获取长度
func (n *Node) getSize() int {
return n.Size
}
// 线性表插入元素
func (n *Node) appends(element int) {
//判断容量
if n.Cap == n.Size {
n.extension(n.Data) //扩容
}
n.Data[n.Size] = element
//数组 size + 1
n.Size = n.Size + 1
}
// 批量插入元素
func (n *Node) appendBatch(element ...int) {
for _, v := range element {
n.appends(v)
}
}
//获取单个元素下标
func (n *Node) getIndex(element int) int {
if n.Size == 0 {
return -1
}
for k, v := range n.Data {
if v == element {
return k
}
}
return -1
}
//获取指定下标的元素
func (n *Node) getElementIndex(index int) int {
if index < 0 || index >= n.Size {
return -1
}
for k, v := range n.Data {
if k == index {
return v
}
}
return -1
}
// 删除线性表指定元素
func (n *Node) deleteElement(element int) int {
index := n.getIndex(element)
//判断是否为最后一个元素
if index == n.Size-1 {
n.Data[index] = 0
} else {
for i := 0; i < n.Size; i++ {
if i >= index {
n.Data[i] = n.Data[i+1]
}
}
}
n.Size = n.Size - 1
return index
}
// 打印输出线性表
func (n *Node) printElement() (res string) {
if n.Size == 0 {
res = "[]"
return
}
res = "["
for i := 0; i < n.Size; i++ {
if i == 0 {
res = fmt.Sprintf("%s%d", res, n.getElementIndex(i))
continue
}
res = fmt.Sprintf("%s %d", res, n.getElementIndex(i))
}
res += "]"
return
}
//测试方法
func main() {
var a, b int
k, err := fmt.Scanln(&a, &b)
if err == nil {
n := initVector(a)
var c, d int //
for i := 1; i <= b; i++ {
j, err := fmt.Scan(&d, &c)
if err != nil {
fmt.Println(j, err)
} else {
if d == 0 { //表示插入操作
n.appends(c)
} else if d == 1 { //表示删除操作
n.deleteElement(c)
} else { //表示获取指定下标元素
fmt.Printf("下标为%d的元素值是 %d\n", c, n.getElementIndex(c))
}
}
fmt.Printf("第%d次操作结果 %s\n", i, n.printElement())
}
} else {
fmt.Println(k)
}
}
go版实现的线性表