forked from UNN/2026-rff_mp
Переписан LinkedLIst на Go
This commit is contained in:
parent
9b92dcc206
commit
7e045c71e0
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
133
stepushovgs/data-structures/sorce/linked_list/linked_list.go
Normal file
133
stepushovgs/data-structures/sorce/linked_list/linked_list.go
Normal 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
|
||||
}
|
||||
83
stepushovgs/data-structures/sorce/linked_list/main.go
Normal file
83
stepushovgs/data-structures/sorce/linked_list/main.go
Normal 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")
|
||||
}
|
||||
}
|
||||
37
stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go
Normal file
37
stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go
Normal 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]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user