golang 實現單鏈表

package main

//鏈表實現
import (
    "fmt"
    "os"
)

//定義錯誤常量
const (
    ERROR = -1000000001
)

//定義元素類型
type Element int64

//定義節點
type LinkNode struct {
    Data Element   //數據域
    Nest *LinkNode //指針域,指向下一個節點
}

//函數接口
type LinkNoder interface {
    Add(head *LinkNode, new *LinkNode)              //後面添加
    Delete(head *LinkNode, index int)               //刪除指定index位置元素
    Insert(head *LinkNode, index int, data Element) //在指定index位置插入元素
    GetLength(head *LinkNode) int                   //獲取長度
    Search(head *LinkNode, data Element)            //查詢元素的位置
    GetData(head *LinkNode, index int) Element      //獲取指定index位置的元素
}

//添加 頭結點,數據
func Add(head *LinkNode, data Element) {
    point := head //臨時指針
    for point.Nest != nil {
        point = point.Nest //移位
    }
    var node LinkNode  //新節點
    point.Nest = &node //賦值
    node.Data = data

    head.Data = Element(GetLength(head)) //打印所有的數據

    if GetLength(head) > 1 {
        Traverse(head)
    }

}

//刪除 頭結點 index 位置
func Delete(head *LinkNode, index int) Element {
    //判斷index合法性
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
        return ERROR
    } else {
        point := head
        for i := 0; i < index-1; i++ {
            point = point.Nest //移位
        }
        point.Nest = point.Nest.Nest //賦值
        data := point.Nest.Data
        return data
    }
}

//插入 頭結點 index位置 data元素
func Insert(head *LinkNode, index int, data Element) {
    //檢驗index合法性
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
    } else {
        point := head
        for i := 0; i < index-1; i++ {
            point = point.Nest //移位
        }
        var node LinkNode //新節點,賦值
        node.Data = data
        node.Nest = point.Nest
        point.Nest = &node
    }
}

//獲取長度 頭結點
func GetLength(head *LinkNode) int {
    point := head
    var length int
    for point.Nest != nil {
        length++
        point = point.Nest
    }
    return length
}

//搜索 頭結點 data元素
func Search(head *LinkNode, data Element) {
    point := head
    index := 0
    for point.Nest != nil {
        if point.Data == data {
            fmt.Println(data, "exist at", index, "th")
            break
        } else {
            index++
            point = point.Nest
            if index > GetLength(head)-1 {
                fmt.Println(data, "not exist at")
                break
            }
            continue
        }
    }
}

//獲取data 頭結點 index位置
func GetData(head *LinkNode, index int) Element {
    point := head
    if index < 0 || index > GetLength(head) {
        fmt.Println("please check index")
        return ERROR
    } else {
        for i := 0; i < index; i++ {
            point = point.Nest
        }
        return point.Data
    }
}

//遍歷 頭結點
func Traverse(head *LinkNode) {
    point := head.Nest
    for point.Nest != nil {
        fmt.Println(point.Data)
        point = point.Nest
    }
    fmt.Println("Traverse OK!")
}

//主函數測試
func main() {
    var head LinkNode = LinkNode{Data: 0, Nest: nil}
    head.Data = 0
    var nodeArray []Element
    for i := 0; i < 10; i++ {
        nodeArray = append(nodeArray, Element(i+1+i*100))
        Add(&head, nodeArray[i])

    }

    Delete(&head, 3)
    Search(&head, 2032)
    Insert(&head, 23, 10010)
    Traverse(&head)
    fmt.Println("data is", GetData(&head, 6))
    fmt.Println("length:", GetLength(&head))
    os.Exit(0)
}
相關文章
相關標籤/搜索