跟上篇文章的区别
仅仅在于。
上篇文章:001_顺序表的实现
我删除了限制,把增的部分改写成了这样:
//增:在末尾添加一个数据
func (list *ArrayList)Append(v interface{})(error){
list.Data = append(list.Data, v)
list.TheSize++
return nil
}
//增:在指定索引位置,插入数据
func (list *ArrayList)Insert(index int, v interface{})(error){
if index < 0 || index >= list.TheSize && index != 0{
return errors.New("索引越界")
}
if list.TheSize == cap(list.Data){ //当数据已经填满了后,需要去调用append给顺序表扩容
list.Data = append(list.Data, nil)
}
list.Data = list.Data[:list.TheSize + 1]
for i := list.TheSize; i > index; i--{
list.Data[i] = list.Data[i-1]
}
list.Data[index] = v
list.TheSize++
return nil
}
请看对比图
我仅仅修改了增的部分
那么,下面,就是全部代码了。
// 作者:itruirui@outlook.com
package main
import (
"fmt"
"os"
"time"
"errors"
"os/exec"
)
func main(){
var list List //定义一个接口类型的数据
list = NewArrayList(10)
play(list) //操作数据的增删改查
}
type List interface{
//实现基本功能,增,删,改,查
//增
Append(v interface{})(error) //在末尾添加一个数据
Insert(index int, v interface{})(error) //在指定位置插入数据
//删
Clear() //清空整个顺序表
Delete(index int)(error) //删除指定索引数据
//改
Set(index int, v interface{})(error) //设置指定索引的数据
//查
CurSize()(int,int) //获取当前已经用空间大小
Get(index int)(interface{}, error) //获取指定索引的数据
GetAll()([]interface{}) //获取所有的数据
}
type ArrayList struct{
Data []interface{}
TheSize int
}
//增:创建一个顺序表
func NewArrayList(size int)(*ArrayList){
list := new(ArrayList)
list.Data = make([]interface{}, 0, size)
list.TheSize = 0
return list
}
func Kuorong(){
}
//增:在末尾添加一个数据
func (list *ArrayList)Append(v interface{})(error){
list.Data = append(list.Data, v)
list.TheSize++
return nil
}
//增:在指定索引位置,插入数据
func (list *ArrayList)Insert(index int, v interface{})(error){
if index < 0 || index >= list.TheSize && index != 0{
return errors.New("索引越界")
}
if list.TheSize == cap(list.Data){ //当数据已经填满了后,需要去调用append给顺序表扩容
list.Data = append(list.Data, nil)
}
list.Data = list.Data[:list.TheSize + 1]
for i := list.TheSize; i > index; i--{
list.Data[i] = list.Data[i-1]
}
list.Data[index] = v
list.TheSize++
return nil
}
//删:清空顺序表
func (list *ArrayList)Clear(){
list.TheSize = 0
}
//删:删除一个指定索引的数据
func (list *ArrayList)Delete(index int)(error){
if index < 0 || index >= list.TheSize{
return errors.New("索引越界")
}
for i := index; i < list.TheSize - 1; i++{
list.Data[i] = list.Data[i+1]
}
if list.TheSize <= 1{
list.TheSize = 0
}else{
list.TheSize--
}
return nil
}
//改:设置指定索引的数据
func (list *ArrayList)Set(index int, v interface{})(error){
if index < 0 || index >= list.TheSize{
return errors.New("索引越界")
}
list.Data[index] = v
return nil
}
//查:获取当前顺序表的len和cap
func (list *ArrayList)CurSize()(int,int){
return list.TheSize, cap(list.Data)
}
//查:获取指定索引的数据
func (list *ArrayList)Get(index int)(interface{}, error){
if index < 0 || index >= list.TheSize{
return nil, errors.New("索引越界")
}
return list.Data[index], nil
}
//查:获取所有的数据
func (list *ArrayList)GetAll()([]interface{}){
var sum []interface{}
for i := 0; i < list.TheSize; i++{
sum = append(sum, list.Data[i])
}
return sum
}
//操作数据的增删改查
func play(list List){
var command = 0
var index int
var data string
for{
fmt.Println("1、末尾新增一个数据")
fmt.Println("2、指定位置插入一个数据")
fmt.Println("3、删除指定位置数据")
fmt.Println("4、清空这个顺序表")
fmt.Println("5、设置指定位置的数据")
fmt.Println("6、查看已用空间")
fmt.Println("7、获取指定位置数据")
fmt.Scan(&command)
fmt.Println("你输入的指令是:", command)
switch command{
case 1:
fmt.Print("请输入数据(value):")
fmt.Scan(&data)
fmt.Println(data)
err := list.Append(data)
if err != nil{
fmt.Println("新增数据失败:", err)
time.Sleep(time.Second * 5)
}
case 2:
fmt.Print("请输入指定位置和数据(index value):")
fmt.Scan(&index, &data)
fmt.Println(index," = ", data)
err := list.Insert(index, data)
if err != nil{
fmt.Println("插入数据失败:", err)
time.Sleep(time.Second * 5)
}
case 3:
fmt.Print("请输入指定位置(index):")
fmt.Scan(&index)
err := list.Delete(index)
if err != nil{
fmt.Println("删除数据失败:", err)
time.Sleep(time.Second * 5)
}
case 4:
list.Clear()
case 5:
fmt.Print("请输入要修改的指定位置和数据(index value):")
fmt.Scan(&index, &data)
fmt.Println(index," = ", data)
err := list.Set(index, data)
if err != nil{
fmt.Println("修改数据失败:", err)
time.Sleep(time.Second * 5)
}
case 6:
l,c := list.CurSize()
fmt.Println("当前已经使用:", l, ",总容量:", c)
time.Sleep(time.Second * 3)
case 7:
fmt.Print("请输入指定位置(index):")
fmt.Scan(&index)
s, err := list.Get(index)
if err != nil{
fmt.Println("查找数据失败:", err)
}else{
fmt.Println("下标为[", index, "]的数据是:", s)
}
time.Sleep(time.Second * 3)
default:
fmt.Println("请重新输入操作!")
time.Sleep(time.Second * 5)
}
cmd := exec.Command("cmd.exe", "/c", "cls")
cmd.Stdout = os.Stdout
cmd.Run()
fmt.Println("打印所有数据:")
fmt.Println("==============================================================================")
fmt.Println(list.GetAll())
fmt.Println("==============================================================================")
}
}