算法入门之路之go语言3

// hash project main.go
package main

import (
	"fmt"
)

// 主函数
func main() {

	fmt.Println("欢迎 来到 Go 语言社区,www.golangweb.com")

	testhash := create_hash_table()

	bret := insert_data_into_hash(testhash, 5)
	bret := insert_data_into_hash(testhash, 6)
	insert_data_into_hash(testhash, 8)
	//insert_data_into_hash(testhash, 1)
	//insert_data_into_hash(testhash, 2)
	insert_data_into_hash(testhash, 3)
	insert_data_into_hash(testhash, 4)
	insert_data_into_hash(testhash, 7)
	insert_data_into_hash(testhash, 9)
	insert_data_into_hash(testhash, 0)
	insert_data_into_hash(testhash, 111)
	insert_data_into_hash(testhash, 12)
	if false == bret {
		fmt.Println("插入失败!!!")
	}
	//delete_data_from_hash(testhash, 11)
	fmt.Println("开始")
	tetsnode := find_data_in_hash(testhash, 111)
	fmt.Println(tetsnode)
	fmt.Println("测试")

	return
}

//hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,
//但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,
//同时不占用太多的内容空间,使用也十分方便。

// a)定义hash表和基本数据节点
type _NODE struct {
	data int
	next *_NODE
}

type _HASH_TABLE struct {
	value [10]*_NODE
}

//  b)创建hash表
func create_hash_table() *_HASH_TABLE {
	// 初始化数据,也就是数据的创建的操作
	pHashTbl := new(_HASH_TABLE)
	return pHashTbl
}

//   c)在hash表当中寻找数据
func find_data_in_hash(pHashTbl *_HASH_TABLE, data int) *_NODE {

	var pNode *_NODE
	// 判断数据为空不
	if nil == pHashTbl {
		return nil
	}
	pNode = pHashTbl.value[data%10]
	fmt.Println("结束", pNode)
	// 数组的数据的判断
	if nil == pNode {
		return nil
	}
	// 循环取数据
	for {
		if nil == pNode {
			break
		}

		if data == pNode.data {
			return pNode
		}
		pNode = pNode.next
	}

	return nil
}

// d)在hash表当中插入数据
func insert_data_into_hash(pHashTbl *_HASH_TABLE, data int) bool {
	var pNode *_NODE
	// 判断数据为空不
	if nil == pHashTbl {
		return false
	}
	fmt.Println(data % 10)
	// 数据转换逻辑
	if nil == pHashTbl.value[data%10] {

		pNode = new(_NODE)
		pNode.data = data
		pHashTbl.value[data%10] = pNode
		fmt.Println("pNode:", pNode)
		return true
	}
	if nil == find_data_in_hash(pHashTbl, data) {
		fmt.Println("错误")
		return false
	}
	pNode = pHashTbl.value[data%10]
	for {
		if nil == pNode.next {
			break
		}
		pNode = pNode.next
	}
	pNode.next = new(_NODE)
	pNode.next.data = data
	return true
}

//     e)从hash表中删除数据

func delete_data_from_hash(pHashTbl *_HASH_TABLE, data int) bool {
	var pHead *_NODE
	var pNode *_NODE

	if nil == pHashTbl || nil == pHashTbl.value[data%10] {
		return false
	}
	pNode = find_data_in_hash(pHashTbl, data)
	if nil == pNode {
		return false
	}
	if pNode == pHashTbl.value[data%10] {
		pHashTbl.value[data%10] = pNode.next
		goto final
	}
	pHead = pHashTbl.value[data%10]
	for {
		if nil == pHead.next {
			break
		}

		pHead = pHead.next
		pHead.next = pNode.next
	}
final:
	// 清除指针数据
	pNode = nil
	return true
}

//总结:
//    1、hash表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;


转载于:https://my.oschina.net/u/2262458/blog/610167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值