靜態鏈表GO語言實現

package main

import (
	"fmt"
	"log"
	"os"
)
//靜態鏈表節點
type Node struct{
	data string
	cursor int
}

const maxSize int=10
//初始化鏈表
func initList(size int)([]Node){
	if size<3 {
		log.Fatal("size參數錯誤")
		return nil
	}
	list:=make([]Node,size)
	for i:=0;i<size-2;i++ {
		list[i].cursor=i+1
	}
	list[size-2].cursor=0
	list[size-1].cursor=0
	return list
}
//顯示鏈表結構
func traverse(list []Node){
	for _,v:=range list {
		fmt.Printf("%5d",v.cursor)
	}
	fmt.Println()
	for _,v:=range list {
		fmt.Printf("%5s",v.data)
	}
	fmt.Println()
	for i,_:=range list {
		fmt.Printf("%5d",i)
	}
	fmt.Println()
}
//回收鏈表到備用鏈表
func destroyList(list []Node){
	if list[maxSize-1].cursor==0 {
		return
	}
	j:=list[maxSize-1].cursor
	list[maxSize-1].cursor=0
	i:=list[0].cursor
	list[0].cursor=j
	if j>0 {
		j=list[j].cursor
	}
	list[j].cursor=i
}
//判斷是否爲空
func isempty(list []Node) bool {
	if list[maxSize-1].cursor==0 {
		return true
	}
	return false
}
//鏈表長度
func length(list []Node) int {
	i,j:=0,list[maxSize-1].cursor
	for j>0 {
		j=list[j].cursor
		i++
	}
	return i
}
//獲取指定位置的節點數據
func getElement(list []Node,index int)string {
	if index<1 || index>maxSize-2 {
		log.Fatal("index out of range")
		return ""
	}
	i:=list[maxSize-1].cursor
	j:=1
	for i>0 && j<index {
		j++
		i=list[i].cursor
	}
	if j!=index {
		return ""
	}
	return list[i].data
}
//獲取數據元素的位置
func locateElem(list []Node,data string) int {
	locate:=0
	i:=list[maxSize-1].cursor
	for i>0 {
		locate++
		if list[i].data==data {
			return locate
		}
		i=list[i].cursor
	}
	return locate
}
//獲取元素的前驅節點
func priorElem(list []Node,data string) string {
	if isempty(list){
		return ""
	}
	i:=list[maxSize-1].cursor
	var j int
	for i>0 {
		j=list[i].cursor
		if list[j].data==data{
			return list[i].data
		}
		i=j
	}
	return ""
}
//獲取元素的後驅節點
func nextElem(list []Node,data string) string {
	if isempty(list) {
		return ""
	}
	i:=list[maxSize-1].cursor
	var j int
	for i>0 {
		j=list[i].cursor
		if list[i].data==data {
			return list[j].data
		}
		i=j
	}
	return ""
}
//分配節點
func malloc(list []Node) int {
	i:=list[0].cursor
	if i==0 {
		os.Exit(0)
	}
	list[0].cursor=list[i].cursor
	return i
}
//回收節點
func free(list []Node,index int){
	list[index].cursor=list[0].cursor
	list[0].cursor=index
}
//插入節點
func insertLIst(list []Node,index int,data string) {
	if index<1 || index>length(list) {
		os.Exit(0)
	}
	i:=list[maxSize-1].cursor
	j:=1
	for i>0 && j<index-1 {
                j++
		i=list[i].cursor
	}
	tmp:=list[i].cursor
	cur:=malloc(list)
	list[cur].data=data
	list[cur].cursor=tmp
	list[i].cursor=cur
}
//刪除節點
func deleteList(list []Node,index int)string{
	if index<1 || index>length(list) {
		return "刪除參數錯誤"
	}
	i:=list[maxSize-1].cursor
	j:=1
	for i>0 && j<index-1 {
		j++
		i=list[i].cursor
	}
	tmp:=list[i].cursor
	list[i].cursor=list[tmp].cursor
	val:=list[tmp].data
	free(list,tmp)
	return val
}
//遍歷鏈表
func traveList(list []Node){
	if list[maxSize-1].cursor==0 {
		return
	}
	i:=list[maxSize-1].cursor
	j:=1
	for i>0 {
		fmt.Printf("第%d個節點爲:%s\n",j,list[i].data)
		i=list[i].cursor
		j++
	}
}

func main() {
	var list []Node
	list=initList(maxSize)
	list[1].data="A"
	list[9].cursor=1
	list[2].data="C"
	list[2].cursor=0
	list[0].cursor=3
	//traverse(list)
        insertLIst(list,2,"B")
	traveList(list)
	reval:=deleteList(list,1)
	fmt.Println("刪除的節點爲:",reval)
	traveList(list)
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章