golang实现顺序表

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版实现的线性表

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值