From 7e045c71e0c6f7f9f01d67598ed407c1b7396157 Mon Sep 17 00:00:00 2001 From: GordStep Date: Sat, 9 May 2026 21:11:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=20LinkedLIst=20=D0=BD=D0=B0=20Go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sorce/bin_search_tree/bst.go | 7 + .../sorce/bin_search_tree/main.go | 11 +- .../sorce/linked_list/linked_list.go | 133 ++++++++++++++++++ .../data-structures/sorce/linked_list/main.go | 83 +++++++++++ .../sorce/linked_list/q_sort_ll.go | 37 +++++ .../linked_list.c | 0 .../linked_list.h | 0 7 files changed, 270 insertions(+), 1 deletion(-) create mode 100644 stepushovgs/data-structures/sorce/linked_list/linked_list.go create mode 100644 stepushovgs/data-structures/sorce/linked_list/main.go create mode 100644 stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go rename stepushovgs/data-structures/sorce/{linked_list => linked_list_c}/linked_list.c (100%) rename stepushovgs/data-structures/sorce/{linked_list => linked_list_c}/linked_list.h (100%) diff --git a/stepushovgs/data-structures/sorce/bin_search_tree/bst.go b/stepushovgs/data-structures/sorce/bin_search_tree/bst.go index fdc8527..a909c0d 100644 --- a/stepushovgs/data-structures/sorce/bin_search_tree/bst.go +++ b/stepushovgs/data-structures/sorce/bin_search_tree/bst.go @@ -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 diff --git a/stepushovgs/data-structures/sorce/bin_search_tree/main.go b/stepushovgs/data-structures/sorce/bin_search_tree/main.go index 07ff05e..5ef8e0d 100644 --- a/stepushovgs/data-structures/sorce/bin_search_tree/main.go +++ b/stepushovgs/data-structures/sorce/bin_search_tree/main.go @@ -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() diff --git a/stepushovgs/data-structures/sorce/linked_list/linked_list.go b/stepushovgs/data-structures/sorce/linked_list/linked_list.go new file mode 100644 index 0000000..db20023 --- /dev/null +++ b/stepushovgs/data-structures/sorce/linked_list/linked_list.go @@ -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 +} diff --git a/stepushovgs/data-structures/sorce/linked_list/main.go b/stepushovgs/data-structures/sorce/linked_list/main.go new file mode 100644 index 0000000..a77923a --- /dev/null +++ b/stepushovgs/data-structures/sorce/linked_list/main.go @@ -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") + } +} diff --git a/stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go b/stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go new file mode 100644 index 0000000..2fd6c0c --- /dev/null +++ b/stepushovgs/data-structures/sorce/linked_list/q_sort_ll.go @@ -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] + } +} diff --git a/stepushovgs/data-structures/sorce/linked_list/linked_list.c b/stepushovgs/data-structures/sorce/linked_list_c/linked_list.c similarity index 100% rename from stepushovgs/data-structures/sorce/linked_list/linked_list.c rename to stepushovgs/data-structures/sorce/linked_list_c/linked_list.c diff --git a/stepushovgs/data-structures/sorce/linked_list/linked_list.h b/stepushovgs/data-structures/sorce/linked_list_c/linked_list.h similarity index 100% rename from stepushovgs/data-structures/sorce/linked_list/linked_list.h rename to stepushovgs/data-structures/sorce/linked_list_c/linked_list.h