ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

golang实现简单哈希表(拉链法解决冲突)

2021-01-02 14:32:53  阅读:266  来源: 互联网

标签:node index return cur 拉链 int value golang 哈希


package main

import (
    "fmt"
)

//可以在初始化时自定义
const Size =10

type Node struct {
    Val int
    Next *Node
}

//结构体指针数组
type Table struct {
    Array []*Node
    //value个数
    Length int
}

//初始化
func (n *Table)Init(){
    n.Array = make([]*Node,Size)
    n.Length = 0
}

//hash值
func Hash(key int)int  {
    return key%Size
}

//查找value,没有则返回nil
func (n*Table)Find(value int)*Node  {
    index:=Hash(value)
    node:=n.Array[index]
    for node!=nil{
        if node.Val==value{
            return node
        }else{
            node = node.Next
        }
    }
    return nil
}

//添加元素
func (n*Table)AddValue(value int)bool  {
    node:=n.Find(value)
    //不存在插入,头插法,redis字典也是这样
    if node==nil{
        index:=Hash(value)
        newNode:=new(Node)
        newNode.Val = value
        newNode.Next = n.Array[index]
        n.Array[index] =newNode
        n.Length++
        return true
    }
    node.Val = value
    return true
}

//删除元素,找到链表位置,去掉节点
//0 删除成功 -1 失败
func (n*Table)DelNode(value int)int  {
    index:=Hash(value)
    var cur,pre *Node
    cur = n.Array[index]
    //不空,寻找value
    for cur!=nil{
        if cur.Val==value{
            //index第一个节点value,则index位置为next
            if pre==nil{
                n.Array[index] = cur.Next
            }else{
                //非第一个节点,去点节点就可以
                pre.Next =cur.Next
            }
            //长度减1
            n.Length--
            return 0
        }
        //继续寻找value
        pre = cur
        cur = cur.Next
    }
    //等于nil则无此值
    return -1
}

//输出哈希表值
func (n*Table)Print()  {
    for i:=0;i<Size;i++{
        cur:=n.Array[i]
        for cur!=nil{
            fmt.Printf("%v ",cur.Val)
            cur = cur.Next
        }
    }
}

func main()  {

table:=new(Table)
    table.Init()
    table.AddValue(2)
    table.AddValue(99)
    table.AddValue(3)
    table.Print()
    fmt.Println()
    table.DelNode(2)
    table.Print()
    fmt.Println(table.Find(99))
}

没有实现达到一定负载扩容的功能。

标签:node,index,return,cur,拉链,int,value,golang,哈希
来源: https://www.cnblogs.com/9527s/p/14222744.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有