Go数据结构与算法-实现List

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang731227/article/details/84987582

title: Go数据结构与算法-实现List
tags: go,算法


介绍

我们将使用切片来模拟上篇的链表的功能,实现对切片的增删改查。

演示

package main

import (
	"errors"
	"fmt"
)

var ListLength  =10  //定义列表全局长度

//interface  实例化int,int., string ,string
type  List interface {
	Size() int  //函数大小,返回大小
	Get(index int)(interface{},error) //根据索引抓取数据
	Set(index int,newval interface{})error //设置
	Insert(index int,newval interface{})error //插入
	Append(newval interface{}) error//追加
	Remove(index int)error   //删除
	Clear() //清空
	String() string //返回字符串
}

//结构体
type ArrayList struct{
	dataStore []  interface{}
	theSize  int
}
//创建新的链表
func  New() *ArrayList{
	list:=new(ArrayList)
	list.dataStore=make([]interface{},0,ListLength) //分配内存10个数组元素

	list.theSize=0  //0
	//fmt.Println("new",list.theSize,cap(list.dataStore))
	return list
}

//获取链表长度
func (list *ArrayList) Size() int{
	return list.theSize  //返回大小

}

//追加数据
func(list *ArrayList)  Append (newval  interface{}){

	list.dataStore=append(list.dataStore,newval) //数据叠加
	list.theSize++ //索引移动
}
// 获取索引所在数据
func (list *ArrayList)  Get(index int)(interface{},error){
	if index <0 || index >=list.theSize{
		return nil,errors.New("索引越界")
	}
	return list.dataStore[index],nil
}

//根据索引更改数据
func (list *ArrayList)  Set(index int,newval interface{})(error){
	if index <0 || index >=list.theSize{
		return errors.New("索引越界")
	}
	list.dataStore[index]=newval //赋值新的值
	return nil
}
// 检查切片是否已满
func (list *ArrayList ) checkmemisfull(){
	if list.Size()==cap(list.dataStore){
		newDataStore:=make([]interface{},0,2*list.Size())//开辟更大内存
		copy(newDataStore,list.dataStore) //拷贝
		list.dataStore=newDataStore //赋值
	}
}

// 插入数据
func (list *ArrayList )Insert(index int,newval interface{})error {
	if index <0 || index >=list.theSize{
		return errors.New("索引越界")
	}
	list.checkmemisfull()
	list.dataStore=list.dataStore[:list.Size()+1]//开辟内存,延展使用的内存
	for i:=list.Size();i>index;i--{
		list.dataStore[i]=list.dataStore[i-1] //从后往前赋值
	}
	list.dataStore[index]=newval  //插入数据
	list.theSize++ //索引加1

	return nil
}
//根据索引移出数据
func (list *ArrayList )Remove(index int)error {
	if index <0 || index >=list.theSize{
		return errors.New("索引越界")
	}

	list.dataStore=append(list.dataStore[:index],list.dataStore[index+1:]...) //删除
	list.theSize--
	return  nil
}
//清空数据
func (list *ArrayList )Clear() {
	list.dataStore=make([]interface{},0,10) //清空
	list.theSize=0
}
// 返回字符串
func (list *ArrayList ) String() string {
	return  fmt.Sprint(list.dataStore)
}

func main(){
	list :=New()
	for i:=0;i<10 ;i++  {
		list.Append(i)
	}
	fmt.Printf("链表长度:%d\n输出链表\n%d\n",list.theSize,list.dataStore)

	list.Remove(3)
	fmt.Println("输出链表")
	fmt.Println(list.dataStore)


	list.Insert(3,100)
	fmt.Println("输出链表")
	fmt.Println(list.dataStore)

	fmt.Println("输出链表")
	fmt.Println(list.String())
}

猜你喜欢

转载自blog.csdn.net/yang731227/article/details/84987582