19、对 queue.go
的代码进行必要的修改,以便存储浮点数而非整数。
要对 queue.go
代码进行修改以存储浮点数而非整数,需要在代码中进行如下操作:
- 将队列数据结构中存储元素的类型从整数类型(如
int
)修改为浮点数类型(如float32
或float64
); - 把入队、出队等操作涉及的元素类型也相应修改为浮点数类型;
- 检查代码中所有与元素类型相关的函数和操作,将其参数和返回值类型都修改为浮点数类型。
20、你能否修改 Go 语言编写的双向链表代码,使链表节点保持有序?并开发一个删除现有节点的函数。
package main
import "fmt"
// Node 定义双向链表节点结构
type Node struct {
Value int
Prev *Node
Next *Node
}
var root *Node
// addNode 有序插入节点
func addNode(t *Node, v int) int {
if root == nil {
t = &Node{v, nil, nil}
root = t
return 0
}
if v < root.Value {
newNode := &Node{v, nil, root}
root.Prev = newNode
root = newNode
return 0
}
for t.Next != nil && t.Next.Value < v {
t = t.Next
}
if t.Next != nil && t.Next.Value == v {
fmt.Println("Node already exists:", v)
return -1
}
newNode := &Node{v, t, t.Next}
if t.Next != nil {
t.Next.Prev = newNode
}
t.Next = newNode
return 0
}
// deleteNode 删除节点
func deleteNode(v int) bool {
if root == nil {
return false
}
if root.Value == v {
if root.Next != nil {
root.Next.Prev = nil
}
root = root.Next
return true
}
t := root
for t.Next != nil {
if t.Next.Value == v {
if t.Next.Next != nil {
t.Next.Next.Prev = t
}
t.Next = t.Next.Next
return true
}
t = t.Next
}
return false
}
func main() {
addNode(root, 1)
addNode(root, 10)
addNode(root, 5)
addNode(root, 0)
addNode(root, 100)
// 打印链表
t := root
for t != nil {
fmt.Print(t.Value, " -> ")
t = t.Next
}
fmt.Println()
// 删除节点
deleteNode(10)
// 再次打印链表
t = root
for t != nil {
fmt.Print(t.Value, " -> ")
t = t.Next
}
fmt.Println()
}
上述代码中, addNode
函数实现了有序插入节点, deleteNode
函数实现了删除指定值的节点。在 main
函数中,先插入一些节点,然后删除一个节点并再次打印链表,以验证功能。
21、修改 hashTableLookup.go 的代码,使哈希表中没有重复值。为此要使用 lookup() 函数!
要修改 hashTableLookup.go
的代码以避免哈希表中出现重复值,可在插入新元素前使用 lookup()
函数检查该元素是否已存在。假设存在插入函数 insert()
,以下是修改示例:
func insert(hash *HashTable, value int) bool {
if lookup(hash, value) {
return false // 元素已存在,不插入
}
index := hashFunction(value, hash.Size)
newNode := &Node{Value: value, Next: nil}
if hash.Table[index] == nil {