Переписан LinkedLIst на Go

This commit is contained in:
GordStep 2026-05-09 21:11:45 +03:00
parent 9b92dcc206
commit 7e045c71e0
7 changed files with 270 additions and 1 deletions

View File

@ -21,6 +21,13 @@ func NewBinSearchTree(name, phone string) *BinSearchTree {
}
}
func (bst *BinSearchTree) Len() int {
if bst == nil {
return 0
}
return 1 + bst.left.Len() + bst.right.Len()
}
func (bst *BinSearchTree) Minimum() *BinSearchTree {
if bst.left == nil {
return bst

View File

@ -1,14 +1,21 @@
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
)
const (
countNumbers = 64
)
func pressEnterToContinue() {
fmt.Print("Нажмите Enter для продолжения...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
// isInArr проверяет, содержится ли target в срезе arr[:len]
func isInArr(arr []int, length int, target int) bool {
for i := 0; i < length; i++ {
@ -45,7 +52,9 @@ func main() {
fmt.Printf("%d ", arr[i])
}
fmt.Printf("\n\nКоличество узлов: %d\n", countNodes(head))
fmt.Printf("\n\nКоличество узлов: %d\n", head.Len())
pressEnterToContinue()
fmt.Println("\ninorder traversal:")
head.BstInorderTraversal()

View File

@ -0,0 +1,133 @@
package main
import (
"fmt"
)
/*
Связный список (LinkedListPhoneBook)
Узел представляется словарём: `{'name': 'Имя', 'phone': '123', 'next': None}.`
Функции:
def ll_insert(head, name, phone) проходит до конца (или сразу добавляет в конец) и возвращает новую голову (если вставка в начало) или изменяет список по ссылке. Удобнее возвращать новую голову, если вставка может быть в начало.
def ll_find(head, name) ищет узел, возвращает телефон или None.
def ll_delete(head, name) удаляет узел, возвращает новую голову.
def ll_list_all(head) собирает все записи в список и сортирует (сортировка вынесена отдельно).
*/
type LinkedList struct {
name string
phone string
next *LinkedList
}
func NewLinkedList(name, phone string) *LinkedList {
return &LinkedList{
name: name,
phone: phone,
next: nil,
}
}
func (ll *LinkedList) ToString() string {
return fmt.Sprintf("Имя: %s, Телефон: %s", ll.name, ll.phone)
}
func (ll *LinkedList) Len() int {
if ll == nil {
return 0
}
len := 0
current := ll
for current != nil {
len++
current = current.next
}
return len
}
func (ll *LinkedList) Insert(name, phone string) *LinkedList {
newNode := NewLinkedList(name, phone)
if ll == nil {
return newNode
}
current := ll
for current.next != nil {
current = current.next
}
current.next = newNode
return ll
}
func (ll *LinkedList) Search(targetName string) (string, bool) {
current := ll
for current != nil {
if current.name == targetName {
return current.phone, true
}
current = current.next
}
return "", false
}
func (ll *LinkedList) PrintAll() {
current := ll
index := 0
for current != nil {
fmt.Printf("[%d] %s\n", index, current.ToString())
index++
current = current.next
}
}
func (ll *LinkedList) Delete(targetName string) (*LinkedList, bool) {
if ll == nil {
return nil, false
}
if ll.name == targetName {
return ll.next, true
}
prev := ll
current := ll.next
for current != nil {
if current.name == targetName {
prev.next = current.next
}
prev = current
current = current.next
}
return ll, false
}
func (ll *LinkedList) listAll() []LinkedList {
current := ll
listLL := make([]LinkedList, ll.Len())
ind := 0
for current != nil {
listLL[ind] = *current
ind++
current = current.next
}
listLL = QSortElementsHT(listLL, 0, len(listLL)-1)
return listLL
}

View File

@ -0,0 +1,83 @@
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
)
const countNumbers = 64
func isInArr(arr []int, length int, target int) bool {
for i := 0; i < length; i++ {
if arr[i] == target {
return true
}
}
return false
}
func pressEnterToContinue() {
fmt.Print("Нажмите Enter для продолжения...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func main() {
fmt.Println("hello world!")
var head *LinkedList = nil
arr := make([]int, countNumbers)
var temp int
for i := 0; i < countNumbers; i++ {
// Генерируем уникальное случайное число
for {
temp = rand.Intn(100) // 0 до 99
if !isInArr(arr, i, temp) {
break
}
}
arr[i] = temp
nameStr := fmt.Sprintf("name_%02d", temp)
phoneStr := fmt.Sprintf("phone_%02d", temp)
head = head.Insert(nameStr, phoneStr)
fmt.Printf("%d ", arr[i])
// pressEnterToContinue()
}
pressEnterToContinue()
fmt.Printf("\n\nКоличество узлов: %d\n", head.Len())
fmt.Println("\ninorder traversal:")
pressEnterToContinue()
head.PrintAll()
pressEnterToContinue()
tarName := "name_44"
fmt.Printf("\nПоиск '%s' перед удалением: ", tarName)
if found, ok := head.Search(tarName); ok {
fmt.Printf("Найден: %s\n", found)
} else {
fmt.Printf("НЕ найден!\n")
}
fmt.Printf("\nУдаляем элемент с значением %s:\n", tarName)
head, _ = head.Delete(tarName)
fmt.Printf("\nКоличество узлов после удаления: %d\n", head.Len())
fmt.Printf("Поиск '%s' после удаления: ", tarName)
if found, ok := head.Search(tarName); ok {
fmt.Printf("ОШИБКА! Все еще существует: %s\n", found)
} else {
fmt.Printf("Успешно удален\n")
}
}

View File

@ -0,0 +1,37 @@
package main
func QSortElementsHT(arr []LinkedList, l, r int) []LinkedList {
if l < r {
s := Partition_Hoa(arr, l, r)
arr = QSortElementsHT(arr, l, s)
arr = QSortElementsHT(arr, s+1, r)
}
return arr
}
func Partition_Hoa(arr []LinkedList, l, r int) int {
p := arr[(l+r)/2].name
i := l - 1
j := r + 1
for {
for {
i++
if arr[i].name >= p {
break
}
}
for {
j--
if arr[j].name <= p {
break
}
}
if i >= j {
return j
}
arr[i], arr[j] = arr[j], arr[i]
}
}