1. 程式人生 > >Go語言(Golang)雙鏈表

Go語言(Golang)雙鏈表

package main

import (
	"fmt"
)

//雙鏈表結構
type TwoLinkTable struct {
	no int 
	name string
	pre *TwoLinkTable
	next *TwoLinkTable
}

//直接在隊尾插入
func InsertNode(head *TwoLinkTable, newNode *TwoLinkTable) {
	temp := head
	
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	temp.next = newNode
	newNode.pre = temp
}

//按編號no從小到大順序插入
func InsertNode2(head *TwoLinkTable, newNode *TwoLinkTable) {
	temp := head
	
	for {
		if temp.next == nil {
			break
		}else if temp.next.no >= newNode.no {
			break
		}
		temp = temp.next
	}

	newNode.next = temp.next
	newNode.pre = temp
	if temp.next != nil {
		temp.next.pre = newNode
	}
	temp.next = newNode
	
}

//按no編號刪除
func DelNode(head *TwoLinkTable, id int) {
	temp := head
	if temp.next == nil {
		fmt.Println("該佇列為空!")
		return
	}

	for {
		if temp.next == nil {
			break
		} else if temp.next.no == id {
			if temp.next.next != nil {
				temp.next.next.pre = temp
			}
			temp.next = temp.next.next
			return
		}
		temp = temp.next
	}
	fmt.Println("未找到該編號的物件")
}

//正序顯示
func ListNodeASC(head *TwoLinkTable) {
	temp := head
	if temp.next == nil {
		fmt.Println("該佇列為空!")
		return
	}
	for {
		if temp.next == nil {
			break
		}
		fmt.Printf("%d:%s\t",temp.next.no,temp.next.name)
		temp = temp.next
	}
}


//倒序顯示
func ListNodeDESC(head *TwoLinkTable) {
	temp := head
	if temp.next == nil {
		fmt.Println("該佇列為空!")
		return
	}
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}
	for {
		fmt.Printf("%d:%s\t",temp.no,temp.name)
		temp = temp.pre
		if temp.pre == nil {
			break
		}
	}
}

func main() {
	head := &TwoLinkTable{}

	newNode1 := &TwoLinkTable {
		no : 1,
		name : "a",
	}
	newNode2 := &TwoLinkTable {
		no : 2,
		name : "b",
	}
	newNode3 := &TwoLinkTable {
		no : 3,
		name : "c",
	}
	InsertNode2(head, newNode2)
	InsertNode2(head, newNode1)
	InsertNode2(head, newNode3)
	DelNode(head,3)
	fmt.Println("正序:")
	ListNodeASC(head)
	fmt.Println("\n逆序:")
	ListNodeDESC(head)
}