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