前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Go 语言社区算法课程 第一季 第3节 hash算法实现

【Go 语言社区算法课程 第一季 第3节 hash算法实现

作者头像
李海彬
发布2018-03-19 17:23:31
6110
发布2018-03-19 17:23:31
举报
文章被收录于专栏:Golang语言社区Golang语言社区
代码语言:javascript
复制
package main


import (

        "fmt"
)

// 主函数

func main() {

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

        testhash := create_hash_table()

        bret := insert_data_into_hash(testhash, 5)

        insert_data_into_hash(testhash, 6)

        if false == bret {

                fmt.Println("插入失败!!!")

        }



        tetsnode := find_data_in_hash(testhash, 5)

        fmt.Println(tetsnode)



        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]

        // 数组的数据的判断

        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

        }



        // 数据转换逻辑

        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) {

                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表不复杂,我们在开发中也经常使用,建议朋友们好好掌握;


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档