Go 데이터 구조의 순서 표 (SqList)

순서 표 - SqList
    순서 표 는 컴퓨터 메모리 에 배열 로 저 장 된 것 으로 주소 연속 저장 장치 가 순서대로 저 장 된 구조 입 니 다. 특징: 조 회 는 상수 시간 이 고 추가 와 삭 제 는 선형 시간 O (n) 입 니 다.
    다음은 제 가 Go 언어 로 이 루어 진 순서 표 입 니 다. 사실은 안에 Go 자체 의 Slice 로 저장 되 어 있 습 니 다. 프로그램 은 상대 적 으로 간단 합 니 다.
   
/**
 * Created with IntelliJ IDEA.
 * Date: 4/24/14
 * Time: 5:11 PM
 *                .
 * Author: [email protected]
 * Copyright 2014 Requelqi. All rights reserved.
 */
package SqList

import (
    "errors"
    "fmt"
)

const (
    DefaultSize = 100
)

//           
type ElementType interface{}

//         
type SqList struct {
    elems []ElementType //    
    pos   int           //         
}

/**
                
*/
func NewSqListBySize(size int) *SqList {
    return &SqList{make([]ElementType, size), -1}
}

/**
 *          
 */
func NewSqListDefault() *SqList {
    return NewSqListBySize(DefaultSize)
}

/**
 *      
 */
func (list *SqList) ClearList() {
    list.pos = -1
}

/**
 *          
 */
func (list *SqList) IsEmptyList() bool {
    return list.pos == -1
}

/**
 *       
 */
func (list *SqList) Length() int {
    return list.pos + 1
}

/**
 *        
 */
func (list *SqList) Capacity() int {
    return cap(list.elems)
}

/**
 *          
 */
func (list *SqList) GetElem(pos int) (ElementType, error) {
    err := list.validPostion(pos)
    if (err != nil) {
        return nil, err
    }
    if list.pos == -1 {
        return nil, nil
    }
    return list.elems[pos], nil
}

/**
 *         
 */
func (list *SqList) AddElement(x ElementType) error {
    if cap(list.elems) == list.pos + 1 {
        return errors.New("The SqList is full.")
    }else {
        list.elems[list.pos + 1] = x
        list.pos++
    }
    return nil
}

/**
 *       
 */
func (list *SqList) Insert(x ElementType, pos int) error {
    err := list.validInsertPostion(pos)
    if (err != nil) {
        return err
    }
    for i := list.pos; i >= pos; i-- {
        list.elems[i + 1] = list.elems[i]
    }
    list.elems[pos] = x
    list.pos++
    return nil
}

/**
             ,      
 */
func (list *SqList) Remove(pos int) error {
    err := list.validPostion(pos)
    if (err != nil) {
        return err
    }
    for i := pos; i < list.pos; i++ {
        list.elems[i] = list.elems[i + 1]
    }
    list.pos--
    return nil
}

/**
             
 */
func (list *SqList) Update(x ElementType, pos int) error {
    err := list.validPostion(pos)
    if err != nil {
        return err
    }
    list.elems[pos] = x
    return nil
}

/**
 *          
 */
func (list *SqList) PrintList() {
    fmt.Println("The elements is:")
    for i := 0; i <= list.pos; i++ {
        tmp, _ := list.GetElem(i)
        fmt.Println(" ", tmp)
    }
}

/**
          ,          pos    。
 */
func (list *SqList) validInsertPostion(pos int) error {
    if pos > cap(list.elems) || pos < 0 {
        return errors.New("SqList pos out 0f bounds error.")
    }
    if pos > list.pos + 1 || pos < 0 {
        return errors.New("you set a wrong position.")
    }
    return nil
}
/**
          ,    (update Or remove Or get)      pos    。
 */
func (list *SqList) validPostion(pos int) error {
    if pos > cap(list.elems) || pos < 0 {
        return errors.New("SqList pos out 0f bounds error.")
    }
    if pos > list.pos || pos < 0 {
        return errors.New("you set a wrong position.")
    }
    return nil
}

 
다음으로 전송:https://www.cnblogs.com/requelqi/p/3690447.html

좋은 웹페이지 즐겨찾기