`
qq466862016
  • 浏览: 125692 次
  • 来自: 杭州
社区版块
存档分类
最新评论

数据结构与算法-表

阅读更多

数据结构与算法-表

        我们将处理一般的型为: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)

}

  

 

  • 大小: 14.7 KB
  • 大小: 20 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics