golang 使用哈希+链表 实现雇员系统

// @Author sunwenbo
// 2024/4/14 22:56
package main

import (
	"fmt"
	"os"
)

// 定义emp
type Emp struct {
	Id   int
	Name string
	Next *Emp
}

// 定义EmpLink,我们这里的EmpLink 不带表头,即第一个结点就存放雇员
type EmpLink struct {
	Head *Emp
}

// 定义hashtable,含有一个链表数组
type HashTable struct {
	LinkArr [7]EmpLink
}

// 显示雇员的详细信息
func (this *Emp) ShowMe() {
	fmt.Printf("链表%d 找到该雇员 \n他的名字为:%s,id:%d\n", this.Id%7, this.Name, this.Id)
}

// 删除员工的方法,保证删除时,编号从小到大
func (this *EmpLink) Delete(emp *Emp) {
	fmt.Printf("开始删除雇员:%s id:%d\n", emp.Name, emp.Id)
	cur := this.Head   // 当前节点指针
	var pre *Emp = nil // 辅助指针,指向要删除节点的前一个节点
	// 如果不是一个空链表,给emp找到对应的位置并删除
	for cur != nil {
		if cur == emp { // 找到要删除的节点
			if pre == nil { // 如果要删除的是头节点
				this.Head = cur.Next
			} else {
				pre.Next = cur.Next
			}
			fmt.Printf("删除成功,删除的雇员信息为:%d, %s\n", cur.Id, cur.Name)
			return
		}
		pre = cur
		cur = cur.Next
	}
	// 循环结束仍未找到要删除的节点
	fmt.Println("未找到要删除的雇员")
}

// 添加员工的方法,保证添加时,编号从小到大
func (this *EmpLink) Insert(emp *Emp) {
	//
	cur := this.Head   // 辅助指针,指向
	var pre *Emp = nil // 这是一个辅助指针 pre在cur前面
	// 如果当前的的EmpLink是一个空链表
	if cur == nil {
		this.Head = emp // cur == nil 的时候,代表首次添加,直接将emp赋值给 this.Head
		return
	}
	// 如果不是一个空链表,给emp找到对应的位置并插入
	// 思路是,让cur和emp 比较,然后让pre保持在cru前面
	for {
		if cur != nil {
			// 比较id,如果当前的id大于要增加的id,跳出循环 往链表添加
			if cur.Id >= emp.Id {
				// 找到为止了
				break
			}
			// 如果当前id小于要添加的id,则将pre 往后移动一位,cur也往后移动一位,再进行上面的循环进行比较,直到找到 break循环
			pre = cur
			cur = cur.Next
		} else { // cur == nil 的时候要添加的id大于链表中的id时,直接跳出循环
			break
		}
	}
	// 开始往链表添加数据
	pre.Next = emp
	// 最后一个值
	emp.Next = cur
}

// 根据id查找对应的雇员,如果没有就返回一个nil
func (this *EmpLink) FindById(id int) *Emp {
	cur := this.Head
	for {
		if cur != nil && cur.Id == id {
			return cur
		} else if cur == nil {
			return nil
		}
		// 查找id,往后移动一位
		cur = cur.Next
	}
	return nil
}

// 显示链表的信息
func (this *EmpLink) Showink(no int) {
	if this.Head == nil {
		fmt.Printf("当前链表%d 为空\n", no)
		return
	}
	// 遍历当前的链表,并显示数据
	cur := this.Head //辅助指针

	for {
		if cur != nil {
			fmt.Printf("链表%d 雇员id=%d 名字=%s --> ", no, cur.Id, cur.Name)
			cur = cur.Next
		} else {
			break
		}
	}
	fmt.Println() //换行处理
}

// 显示hashtable的所有员工的方法
func (this *HashTable) ShowAll() {
	for i := 0; i < len(this.LinkArr); i++ {
		this.LinkArr[i].Showink(i)
	}
}

// 给HashTable 编写Insert 雇员的方法
func (this *HashTable) Inster(emp *Emp) {
	// 使用散列函数,确定将该雇员添加到哪个链表
	linkNo := this.HashFun(emp.Id)
	// 使用对应的链表添加
	this.LinkArr[linkNo].Insert(emp)
}

// 给HashTable 编写Delete 雇员的方法
func (this *HashTable) Delete(emp *Emp) {
	// 使用散列函数,确定将该雇员从哪个链表删除
	linkNo := this.HashFun(emp.Id)
	// 使用对应的链表进行删除
	this.LinkArr[linkNo].Delete(emp)
}

// 编写一个散列的方法
func (this *HashTable) HashFun(id int) int {
	return id % len(this.LinkArr) // 得到一个值,就是对应的链表的下标
}

// 编写一个方法,完成查找用户id
func (this *HashTable) FindById(id int) *Emp {
	// 使用散列函数,确定该雇员在哪个链表
	linkNo := this.HashFun(id)
	return this.LinkArr[linkNo].FindById(id)
}

func main() {
	key := ""
	id := 0
	name := ""
	hashtable := HashTable{}
	emp := Emp{
		Id:   3,
		Name: "tom",
	}
	emp1 := Emp{
		Id:   10,
		Name: "jack",
	}
	emp2 := Emp{
		Id:   17,
		Name: "mary",
	}
	hashtable.Inster(&emp)
	hashtable.Inster(&emp1)
	hashtable.Inster(&emp2)

	for {
		fmt.Println("==================雇员系统菜单==================")
		fmt.Println("input 表示添加雇员")
		fmt.Println("show  表示显示雇员")
		fmt.Println("find  表示查找雇员")
		fmt.Println("dele  表示删除雇员")
		fmt.Println("exit  表示退出系统")
		fmt.Println("请输入你的选择:")
		fmt.Scanln(&key)
		switch key {
		case "input":
			fmt.Println("输入雇员id:")
			fmt.Scanln(&id)
			fmt.Println("输入雇员name:")
			fmt.Scanln(&name)
			emp := Emp{
				Id:   id,
				Name: name,
			}
			hashtable.Inster(&emp)
		case "show":
			hashtable.ShowAll()
		case "find":
			fmt.Println("请输入id号:")
			fmt.Scanln(&id)
			emp := hashtable.FindById(id)
			if emp == nil {
				fmt.Printf("id=%d 的雇员不存在\n", id)
			} else {
				// 编写一个方法,显示雇员信息
				emp.ShowMe()
			}
		case "dele":
			fmt.Println("请输入要删除的雇员id号:")
			fmt.Scanln(&id)
			emp := hashtable.FindById(id)
			if emp == nil {
				fmt.Printf("id=%d 的雇员不存在,无法完成删除\n", id)
			} else {
				hashtable.Delete(emp)
			}

		case "exit":
			os.Exit(0)
		default:
			fmt.Println("输入错误..")
		}

	}

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用Golang和Gin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用Gin和Golang的标准库来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloud孙文波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值