package main
import (
"fmt"
"sync"
)
type SingleObject interface {
}
type SingleNode struct {
Data SingleObject
Next *SingleNode
}
type SingleList struct {
mutex *sync.RWMutex
Head *SingleNode
Tail *SingleNode
Size uint
}
//鏈表數據結構初始化
func (list *SingleList)Init() {
list.Size=0
list.Head=nil
list.Tail=nil
list.mutex=new(sync.RWMutex)
}
//添加節點
func (list *SingleList)Add(node *SingleNode) bool {
if node==nil{
return false
}
//併發鎖
list.mutex.Lock()
//執行結束後解鎖
defer list.mutex.Unlock()
if list.Size==0{
list.Head=node
list.Tail=node
list.Size=1
return true
}
tail:=list.Tail
tail.Next=node
//當前節點頭指向下一個節點
list.Tail=node
list.Size+=1
return true
}
//指定指針 添加節點
func (list *SingleList)Insert(index uint,node *SingleNode) bool{
if node==nil{
return false
}
//如果索引長度大於記錄的鏈表長度
if index > list.Size{
return false
}
list.mutex.Lock()
defer list.mutex.Unlock()
if index==0{
node.Next=list.Head
list.Head=node
list.Size+=1
return true
}
var i uint
ptr :=list.Head
for i=1;i<index;i++{
ptr=ptr.Next
}
next:=ptr.Next
ptr.Next=node
node.Next=next
list.Size+=1
return true
}
//刪除節點
func(list *SingleList)Delete(index uint) bool{
if list==nil||list.Size==0||index>list.Size-1{
return false
}
list.mutex.Lock()
defer list.mutex.Unlock()
if index==0{
head:=list.Head.Next
list.Head=head
if list.Size==1{
list.Tail=nil
}
list.Size-=1
return true
}
ptr:=list.Head
var i uint
for i=1;i<index;i++{
ptr=ptr.Next
}
next:=ptr.Next
ptr.Next=next.Next
if index == list.Size - 1 {
list.Tail = ptr
}
list.Size -= 1
return true
}
func (list *SingleList)Get(index uint)*SingleNode{
if list == nil || list.Size == 0 || index > list.Size - 1 {
return nil
}
list.mutex.RLock()
defer list.mutex.RUnlock()
if index == 0{
return list.Head
}
node := list.Head
var i uint
for i = 0; i < index; i ++ {
node = node.Next
}
return node
}
// 輸出鏈表
func (list *SingleList)Display(){
if list == nil {
fmt.Println("this single list is nil")
return
}
list.mutex.RLock()
defer list.mutex.RUnlock()
fmt.Printf("this single list size is %d \n", list.Size)
ptr := list.Head
var i uint
for i = 0; i < list.Size; i++{
fmt.Printf("No%3d data is %v\n", i + 1, ptr.Data)
ptr = ptr.Next
}
}
func main(){
var s=SingleList{}
s.Init()
for i:=0;i<10;i++{
s.Add(&SingleNode{Data:1})
s.Insert(1, &SingleNode{Data:2})
}
s.Display()
}
golang實現單鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.