数据结构与算法-表
我们将处理一般的型为:A1、A2、A3....AN的表,这个表的大小为N,不包含有任何一个元素大小为0的我们称为空表。 我们称为An+1为An的后继、 An-1为An的前驱。表的实现为简单的数组和链表两种。
一、简单数组
简单的数组我们需要给定的最大大小并且各个元素相间内存空间是连续的。数组在操作中:查找需要消耗O(1),但是在插入和删除的时候非常麻烦会将指定位置之前的数据移动操作最坏的情况为O(N)。
二、链表
为了避免删除和插入打开销。我们允许表可以不连续的存储。否则将会整个表或者部分整体移动。这就是我们所说的链表。链表是当前节点存在内容以及指向下一个节点的指针。结束节点的指向下一个节点的指针为nil,表明此节点是最后一个节点。我们约定表头在0位置我们称为header 节点。我们会根据此header节点进行链表的操作。
下面是链表操作实现代码
package link
import (
"fmt"
)
type Node struct {
Element interface{}
Next *Node
}
// 初始化链表
func MakeEmpty(header *Node) *Node {
header = new(Node)
return header
}
// 判断节点是否为空
func IsEmpty(header *Node) bool {
return header.Next == nil
}
// 查找节点
func Find(element interface{}, header *Node) *Node {
if !IsEmpty(header) {
var p = header
for p.Next != nil {
if p.Element == element {
return p
}
p = p.Next
}
return nil
} else {
return nil
}
}
// 删除节点
func Delete(element interface{}, header *Node) {
if IsEmpty(header) {
fmt.Println("节点为空....")
return
}
preNode := FindPrevious(element, header)
if preNode != nil {
p := header.Next
for p != nil {
if p.Element == element {
preNode.Next = p.Next
p = nil
return
}
}
} else {
fmt.Println("node is nil")
}
}
// 查找前一个节点
func FindPrevious(element interface{}, header *Node) *Node {
if IsEmpty(header) {
return nil
}
p := header.Next
s := header
fmt.Println(s)
for p != nil {
if p.Element == element {
return s
}
s = p
p = p.Next
}
return nil
}
// 插入一个节点
func Insert(element interface{}, header *Node, n *Node) {
ntemp := new(Node)
ntemp.Element = element
ntemp.Next = nil
n.Next = ntemp
}
// 获取大小
func Size(header *Node) int {
if IsEmpty(header) {
return 0
} else {
p := header.Next
var size int = 0
for p != nil {
size++
p = p.Next
}
return size
}
}
// 打印
func Print(header *Node) {
if IsEmpty(header) {
return
}
p := header.Next
for p != nil {
fmt.Println(p.Element)
p = p.Next
}
}
package main
import (
"fmt"
"web/link"
)
func main() {
var n *link.Node
node := link.MakeEmpty(n)
fmt.Println(node)
link.Insert(12, node, node)
fmt.Println(link.IsEmpty(node))
fmt.Println(node.Next.Element)
fmt.Println(link.FindPrevious(12, node))
link.Delete(12, node)
fmt.Println(node)
}