44*
55* Implementação da lista sequencial cujos elementos estão ordenados
66*
7- * link Go PlayGround: https://play.golang.org/p/NWrpCHdFvv8
7+ * link Go PlayGround: https://play.golang.org/p/J6Jbi2_FWJk
88 */
99
10- package main
10+ package main
1111
12- import "fmt"
13-
14- var maxSize = 50
15-
16- // Estrura que será guardada em cada posição da lista
17- type Registro struct {
18- valor int
19- // Outros campos podem ser adicionados aqui
20- }
21-
22- // Estrutura que guarda um arranjo de Registro, e o número de elementos no arranjo
23- type Lista struct {
24- arranjoRegistros []Registro
25- numeroElementos int
26- }
27-
28- // Cria uma nova lista
29- func criarLista () Lista {
30- lista := Lista {
31- arranjoRegistros : make ([]Registro , maxSize ),
32- numeroElementos : 0 ,
33- }
34-
35- return lista
36- }
37-
38- // reseta o contador de elementos da lista
39- func inicializar (lista * Lista ) {
40- lista .numeroElementos = 0
41- }
42-
43- // Recupera a quantidade de elementos da lista
44- func tamanho (lista * Lista ) int {
45- return lista .numeroElementos
46- }
47-
48- // Imprime valores dos elementos na lista
49- func imprimir (lista * Lista ) {
50- for i := 0 ; i < lista .numeroElementos ; i ++ {
51- fmt .Printf ("%v " , lista .arranjoRegistros [i ].valor )
52- }
53- fmt .Println ()
54- }
55-
56- // Realiza busca binária na lista
57- func buscaBinaria (lista * Lista , valor int ) int {
58- esquerda := 0
59- direita := lista .numeroElementos - 1
60-
61- for esquerda <= direita {
62- meio := ((esquerda + direita ) / 2 )
63- if lista .arranjoRegistros [meio ].valor == valor {
64- return meio
65- } else {
66- if lista .arranjoRegistros [meio ].valor < valor {
67- esquerda = meio + 1
68- } else {
69- direita = meio - 1
70- }
71- }
72- }
73-
74- return - 1
75- }
76-
77- // Insere elementos na lista em ordem crescente, garantindo com a lista esteja sempre ordenada
78- func insereRegistroOrdenado (lista * Lista , registro Registro ) bool {
79- if lista .numeroElementos == maxSize {
80- return false
81- }
82-
83- posicao := lista .numeroElementos
84-
85- for posicao > 0 && lista .arranjoRegistros [posicao - 1 ].valor > registro .valor {
86- lista .arranjoRegistros [posicao ] = lista .arranjoRegistros [posicao - 1 ]
87- posicao --
88- }
89-
90- lista .arranjoRegistros [posicao ] = registro
91- lista .numeroElementos ++
92-
93- return true
94- }
95-
96- // Exclui um elemento da lista
97- func excluirElemento (lista * Lista , valor int ) bool {
98- posicao := buscaBinaria (lista , valor )
99-
100- if posicao == - 1 {
101- return false
102- }
103-
104- for i := posicao ; i < lista .numeroElementos - 1 ; i ++ {
105- lista .arranjoRegistros [i ] = lista .arranjoRegistros [i + 1 ]
106- }
107-
108- lista .numeroElementos --
109-
110- return true
111- }
112-
113- func main () {
114- lista := criarLista ()
115-
116- inicializar (& lista )
117-
118- fmt .Println ("Inserindo valores na lista..." )
119- insereRegistroOrdenado (& lista , Registro {valor : 20 })
120- insereRegistroOrdenado (& lista , Registro {valor : 10 })
121- insereRegistroOrdenado (& lista , Registro {valor : 70 })
122- insereRegistroOrdenado (& lista , Registro {valor : 30 })
123- insereRegistroOrdenado (& lista , Registro {valor : 60 })
124- insereRegistroOrdenado (& lista , Registro {valor : 90 })
125- insereRegistroOrdenado (& lista , Registro {valor : 80 })
126- insereRegistroOrdenado (& lista , Registro {valor : 15 })
127- insereRegistroOrdenado (& lista , Registro {valor : 1 })
128-
129- fmt .Println ()
130- fmt .Println ("Imprimindo lista..." )
131- imprimir (& lista )
132- fmt .Println ("Tamanho da lista:" , tamanho (& lista ))
133-
134- fmt .Println ()
135-
136- fmt .Println ("Excluindo elemento 80 da lista..." )
137- excluirElemento (& lista , 80 )
138-
139- fmt .Println ()
140- fmt .Println ("Imprimindo lista..." )
141- imprimir (& lista )
142- fmt .Println ("Tamanho da lista:" , tamanho (& lista ))
143-
144-
145- fmt .Println ()
146- fmt .Println ("Buscando valores na lista:" )
147- fmt .Println ()
148-
149- fmt .Println ("Buscando posição do numero 15:" )
150- fmt .Printf ("Posição do número 15: %v \n \n " , buscaBinaria (& lista , 15 ))
151-
152- fmt .Println ("Buscando posição do valor 100:" )
153- fmt .Printf ("Posição do número 100: %v \n \n " , buscaBinaria (& lista , 100 ))
154- }
155-
12+ import "fmt"
13+
14+ var maxSize = 50
15+
16+ // Estrura que será guardada em cada posição da lista
17+ type Registro struct {
18+ valor int
19+ // Outros campos podem ser adicionados aqui
20+ }
21+
22+ // Estrutura que guarda um arranjo de Registro, e o número de elementos no arranjo
23+ type Lista struct {
24+ arranjoRegistros []Registro
25+ numeroElementos int
26+ }
27+
28+ // Cria uma nova lista
29+ func criarLista () Lista {
30+ lista := Lista {
31+ arranjoRegistros : make ([]Registro , maxSize ),
32+ numeroElementos : 0 ,
33+ }
34+
35+ return lista
36+ }
37+
38+ // reseta o contador de elementos da lista
39+ func inicializar (lista * Lista ) {
40+ lista .numeroElementos = 0
41+ }
42+
43+ // Recupera a quantidade de elementos da lista
44+ func tamanho (lista * Lista ) int {
45+ return lista .numeroElementos
46+ }
47+
48+ // Imprime valores dos elementos na lista
49+ func imprimir (lista * Lista ) {
50+ for i := 0 ; i < lista .numeroElementos ; i ++ {
51+ fmt .Printf ("%v " , lista .arranjoRegistros [i ].valor )
52+ }
53+ fmt .Println ()
54+ }
55+
56+ // Realiza busca binária na lista
57+ func buscaBinaria (lista * Lista , valor int ) int {
58+ esquerda := 0
59+ direita := lista .numeroElementos - 1
60+
61+ for esquerda <= direita {
62+ meio := ((esquerda + direita ) / 2 )
63+ if lista .arranjoRegistros [meio ].valor == valor {
64+ return meio
65+ } else {
66+ if lista .arranjoRegistros [meio ].valor < valor {
67+ esquerda = meio + 1
68+ } else {
69+ direita = meio - 1
70+ }
71+ }
72+ }
73+
74+ return - 1
75+ }
76+
77+ // Insere elementos na lista em ordem crescente, garantindo com a lista esteja sempre ordenada
78+ func insereRegistroOrdenado (lista * Lista , registro Registro ) bool {
79+ if lista .numeroElementos == maxSize {
80+ return false
81+ }
82+
83+ posicao := lista .numeroElementos
84+
85+ for posicao > 0 && lista .arranjoRegistros [posicao - 1 ].valor > registro .valor {
86+ lista .arranjoRegistros [posicao ] = lista .arranjoRegistros [posicao - 1 ]
87+ posicao --
88+ }
89+
90+ lista .arranjoRegistros [posicao ] = registro
91+ lista .numeroElementos ++
92+
93+ return true
94+ }
95+
96+ // Exclui um elemento da lista
97+ func excluirElemento (lista * Lista , valor int ) bool {
98+ posicao := buscaBinaria (lista , valor )
99+
100+ if posicao == - 1 {
101+ return false
102+ }
103+
104+ for i := posicao ; i < lista .numeroElementos - 1 ; i ++ {
105+ lista .arranjoRegistros [i ] = lista .arranjoRegistros [i + 1 ]
106+ }
107+
108+ lista .numeroElementos --
109+
110+ return true
111+ }
112+
113+ func main () {
114+ lista := criarLista ()
115+
116+ inicializar (& lista )
117+
118+ fmt .Println ("Inserindo valores na lista..." )
119+ insereRegistroOrdenado (& lista , Registro {valor : 20 })
120+ insereRegistroOrdenado (& lista , Registro {valor : 10 })
121+ insereRegistroOrdenado (& lista , Registro {valor : 70 })
122+ insereRegistroOrdenado (& lista , Registro {valor : 30 })
123+ insereRegistroOrdenado (& lista , Registro {valor : 60 })
124+ insereRegistroOrdenado (& lista , Registro {valor : 90 })
125+ insereRegistroOrdenado (& lista , Registro {valor : 80 })
126+ insereRegistroOrdenado (& lista , Registro {valor : 15 })
127+ insereRegistroOrdenado (& lista , Registro {valor : 1 })
128+
129+ fmt .Println ()
130+ fmt .Println ("Imprimindo lista..." )
131+ imprimir (& lista )
132+ fmt .Println ("Tamanho da lista:" , tamanho (& lista ))
133+
134+ fmt .Println ()
135+
136+ fmt .Println ("Excluindo elemento 80 da lista..." )
137+ excluirElemento (& lista , 80 )
138+
139+ fmt .Println ()
140+ fmt .Println ("Imprimindo lista..." )
141+ imprimir (& lista )
142+ fmt .Println ("Tamanho da lista:" , tamanho (& lista ))
143+
144+ fmt .Println ()
145+ fmt .Println ("Buscando valores na lista:" )
146+ fmt .Println ()
147+
148+ fmt .Println ("Buscando posição do numero 15:" )
149+ fmt .Printf ("Posição do número 15: %v \n \n " , buscaBinaria (& lista , 15 ))
150+
151+ fmt .Println ("Buscando posição do valor 100:" )
152+ fmt .Printf ("Posição do número 100: %v \n \n " , buscaBinaria (& lista , 100 ))
153+ }
0 commit comments