前序
区块链一直是人们的热门话题,但是其实所谓区块链就是将结构体按照出现的次序进行了串联,从而形成了区块链。现实中的区块链的块,是规定了块的大小,以及当前区块的哈希值和上一区块的哈希值,并且只有与上一区块的哈希值相一致,才可以加入到区块链中。本文只是简单的介绍区块的基本构造以及简单加入链中。
这里我们假设一个块就是一个节点,并将这些节点一个一个的加入,可实现插入或者删除的功能,及顺序显示和逆序显示,如下为实现的代码:
代码
package main
import (
"fmt"
)
//定义一个人的节点peopleNode
type HumanNode struct {
id int
name string
pre *HumanNode //表示指向前一个节点
next *HumanNode //表示指向下一个节点
}
//插入
func InsertNode(head , newNode *HumanNode) {
//先找到该链表的最后这个节点
//再创建一个临时辅助节点
temp := head
//让插入的节点的id,与temp的下一个节点的id比较
//flag: 初始值为true,这里也可以用int类型的1 或 0 来表示
flag := true
for {
if temp.next == nil {//说明已经到了链表的最后
break
} else if temp.next.id > newNode.id {
//说明newNode 就应该插入到temp后面
break
} else if temp.next.id == newNode.id {
//说明链表中已经有这个id. 就不能再插入
flag = false
break
}
temp = temp.next //让temp不断的指向下一个节点
}
if !flag {
fmt.Printf("the Id:%d existed and can not be inserted",newNode.id)
return
} else {
newNode.next = temp.next //先将newNode.next指向temp.next
newNode.pre = temp //再将newNode.pre(前一个指针)指向temp
if temp.next != nil { //判断如果temp.next后面没有了
temp.next.pre = newNode //就直接加在尾部,即newNode.Pre=temp
}
temp.next = newNode
}
}
//删除
func DelNode(head *HumanNode, id int) {
//需要找到该链表的最后这个节点
//先创建一个辅助节点,将辅助节点指向head
helper := head
//找到要删除的节点id,与temp的下一个节点的id比较
flag := false
for {
if helper.next == nil {//说明已经到了链表的最后
break
}else if helper.next.id == id {
flag = true
break
}
helper = helper.next //move on next node
}
if flag {
fmt.Printf("the No:%d is found and remove it...\n",id)
//先将要删除的节点helper的next指针指向,helper.next的下一个节点
helper.next = helper.next.next
if helper.next != nil { //即如果helper.next不为空
//将helper.next的前一个指针直接指向helper,即跳过了要被删除的节点
helper.next.pre = helper
}
return
} else {
fmt.Println("no such id can be found...")
}
}
//正序显示
func ShowAllNodeByOrder(head *HumanNode) {
//创建一个临时节点
temp := head
//先判断该链表是不是一个空链表
if temp.next == nil {
fmt.Println("empty link ...")
return
}
//遍历这个链表
for {
fmt.Printf("[%d, %s] ==>",temp.next.id,temp.next.name)
//判断是否为链表尾了
temp = temp.next
if temp.next == nil {
break
}
}
println()
}
//倒序显示
func ShowAllNodeByReverse(head *HeroNode) {
temp := head
if temp.next == nil {
fmt.Println("empty link ...")
return
}
//先将temp定位到最后
for {
if temp.next == nil {
break
}
temp = temp.next
}
//遍历这个链表
for {
fmt.Printf("[%d, %s] ==>",temp.no,temp.name)
//判断是否为链表的首位
temp = temp.pre
if temp.pre == nil {
break
}
}
println()
}
func main() {
//创建一个头结点
head := &HumanNode{}
//创建一个新的HumanNode
humanNode1 := &HumanNode{
id : 1,
name :"wang",
}
humanNode2 := &HumanNode{
id : 2,
name :"zhang",
}
humanNode3 := &HumanNode{
id : 3,
name :"zhao",
}
humanNode4 := &HumanNode{
id : 4,
name :"zhou",
}
humanNode5 := &HumanNode{
id : 5,
name :"song",
}
//简单加入节点(如果是真的区块链,则需将前一个区块的哈希值与当前区块的pre的哈希值进行比较)
InsertNode(head,humanNode2)
InsertNode(head,humanNode4)
InsertNode(head,humanNode1)
InsertNode(head,humanNode5)
InsertNode(head,humanNode3)
//显示
fmt.Println("顺序显示:")
ShowAllNodeByOrder(head)
fmt.Println("逆序显示:")
ShowAllNodeByReverse(head)
//删除
DelNode(head,5)
ShowAllNodeByOrder(head)
}