-
Notifications
You must be signed in to change notification settings - Fork 0
/
Index.c
287 lines (261 loc) · 10.1 KB
/
Index.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Definição da estrutura do nó da árvore
*
* 1 - Cada nó da árvore deve representar um produto, contendo os seguintes campos: código do produto, nome do produto,
* quantidade em estoque, preço unitário.*/
typedef struct Node {
int codigo;
char nome[50];
int quantidade;
float preco;
struct Node* esquerda;
struct Node* direita;
} Node;
// Função para criar nó
Node* criarNo(int codigo, const char *nome, int quantidade, float preco) {
if (codigo < 0 || quantidade < 0 || preco < 0) {
printf("Nao e possivel criar o no com valores negativos.\n");
exit(EXIT_FAILURE);
}
Node* novoNo = (Node*)calloc(1, sizeof(Node)); // Inicializa a memória alocada com zero
if (novoNo == NULL) {
printf("Erro na alocacao de memoria.\n");
exit(EXIT_FAILURE);
}
novoNo->codigo = codigo;
strcpy(novoNo->nome, nome);
novoNo->quantidade = quantidade;
novoNo->preco = preco;
novoNo->esquerda = NULL;
novoNo->direita = NULL;
return novoNo;
}
/* Função para inserir elementos na árvore
*
* 2 - Implemente uma função para inserir um novo produto na árvore, mantendo-a balanceada. Garanta que a árvore
* não esteja desbalanceada em mais de 1 nível.
*
* 8 - Garanta que não é possível inserir produtos com códigos duplicados na árvore, nem quantidades ou
* preços menores que zero.*/
Node* inserir(Node* raiz, int codigo, const char *nome, int quantidade, float preco) {
if (codigo < 0 || quantidade < 0 || preco < 0) {
printf("Nao e possivel inserir um produto com valores negativos.\n");
return raiz; // Retorna a raiz original sem inserir o produto
}
if (raiz == NULL) {
raiz = criarNo(codigo, nome, quantidade, preco);
printf("Produto inserido com sucesso!\n");
return raiz;
}
if (codigo == raiz->codigo) {
printf("Produto com codigo %d ja existe na arvore.\n", codigo);
return raiz; // Retorna a raiz original sem inserir o produto duplicado
}
if (codigo < raiz->codigo) {
raiz->esquerda = inserir(raiz->esquerda, codigo, nome, quantidade, preco);
} else if (codigo > raiz->codigo) {
raiz->direita = inserir(raiz->direita, codigo, nome, quantidade, preco);
}
// Balanceamento da árvore (a ser implementado)
return raiz;
}
/* Função para remover um elemento da árvore
*
* 3 - Implemente uma função para remover um produto da árvore, atualizando a estrutura para manter
* a propriedade da árvore binária.*/
Node* remover(Node* raiz, int chave) {
if (raiz == NULL) {
printf("Valor nao encontrado!\n");
return NULL;
} else {
if (raiz->codigo == chave) {
// Remove nós folhas
if (raiz->esquerda == NULL && raiz->direita == NULL) {
printf("Removendo o produto: Codigo: %d, Nome: %s, Quantidade: %d, Preco: %.2f\n", raiz->codigo, raiz->nome, raiz->quantidade, raiz->preco);
free(raiz);
return NULL;
} else {
// Remove nós que possuem apenas 1 filho
if (raiz->esquerda == NULL || raiz->direita == NULL) {
Node *aux;
if (raiz->esquerda != NULL)
aux = raiz->esquerda;
else
aux = raiz->direita;
printf("Removendo o produto: Codigo: %d, Nome: %s, Quantidade: %d, Preco: %.2f\n", raiz->codigo, raiz->nome, raiz->quantidade, raiz->preco);
free(raiz);
return aux;
} else {
// Remove nós com dois filhos
Node* aux = raiz->esquerda;
while (aux->direita != NULL)
aux = aux->direita;
raiz->codigo = aux->codigo;
strcpy(raiz->nome, aux->nome); // Atualiza o nome
raiz->quantidade = aux->quantidade; // Atualiza a quantidade
raiz->preco = aux->preco; // Atualiza o preço
raiz->esquerda = remover(raiz->esquerda, aux->codigo); // Remove o nó sucessor
return raiz;
}
}
} else {
if (chave < raiz->codigo)
raiz->esquerda = remover(raiz->esquerda, chave);
else
raiz->direita = remover(raiz->direita, chave);
return raiz;
}
}
return NULL;
}
/* Função para buscar um produto pelo código
*
* 4 Implemente uma função para buscar um produto na árvore pelo seu código.*/
Node* buscar(Node* raiz, int codigo) {
if (raiz == NULL || raiz->codigo == codigo) {
return raiz;
}
if (codigo < raiz->codigo) {
return buscar(raiz->esquerda, codigo);
} else {
return buscar(raiz->direita, codigo);
}
}
/* Função para listar produtos com quantidade menor que um valor especificado
*
* 5 - Implemente uma função para listar todos os produtos com uma quantidade menor que a informada pelo usuário.*/
void listarQuantidadeMenor(Node* raiz, int valor) {
if (raiz == NULL) {
return;
}
listarQuantidadeMenor(raiz->esquerda, valor);
if (raiz->quantidade < valor) {
printf("Codigo: %d, Nome: %s, Quantidade: %d, Preco: %.2f\n", raiz->codigo, raiz->nome, raiz->quantidade, raiz->preco);
}
listarQuantidadeMenor(raiz->direita, valor);
}
/* Função para listar produtos com preço dentro de uma faixa especificada
*
* 6 - Implemente uma função para listar todos os produtos em uma faixa de preço especificada pelo usuário.*/
void listarFaixaPreco(Node* raiz, float minPreco, float maxPreco) {
if (raiz == NULL) {
return;
}
listarFaixaPreco(raiz->esquerda, minPreco, maxPreco);
if (raiz->preco >= minPreco && raiz->preco <= maxPreco) {
printf("Codigo: %d, Nome: %s, Quantidade: %d, Preco: %.2f\n", raiz->codigo, raiz->nome, raiz->quantidade, raiz->preco);
}
listarFaixaPreco(raiz->direita, minPreco, maxPreco);
}
/* Função para calcular o valor total do estoque
*
* 7 - Implemente uma função para calcular o valor total do estoque da loja.*/
float calcularValorTotal(Node* raiz) {
if (raiz == NULL) {
return 0;
}
return raiz->preco * raiz->quantidade + calcularValorTotal(raiz->esquerda) + calcularValorTotal(raiz->direita);
}
/* Função para imprimir a árvore
*
* 10 - O código deve implementar uma maneira de exibir a árvore de maneira intuitiva no console.*/
void imprimirArvore(Node* raiz, int espacos) {
if (raiz == NULL) {
return;
}
espacos += 10;
imprimirArvore(raiz->direita, espacos);
printf("\n");
for (int i = 10; i < espacos; i++) {
printf(" ");
}
printf("%d - %s\n", raiz->codigo, raiz->nome);
imprimirArvore(raiz->esquerda, espacos);
}
int main() {
Node* raiz = NULL;
int opcao;
do {
printf("\n=== Menu ===\n");
printf("0. Sair\n");
printf("1. Inserir produto\n");
printf("2. Remover produto\n");
printf("3. Buscar produto\n");
printf("4. Listar produtos com preco dentro de uma faixa\n");
printf("5. Listar produtos com quantidade menor que um valor especificado\n");
printf("6. Calcular valor total do estoque\n");
printf("7. Imprimir arvore de produtos\n");
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
switch (opcao) {
case 0:
printf("Saindo...\n");
break;
case 1: {
int codigo, quantidade;
float preco;
char nome[50];
printf("\nDigite o codigo do produto:");
scanf("%d", &codigo);
printf("Digite o nome do produto:");
scanf("%s", nome);
printf("Digite a quantidade do produto:");
scanf("%d", &quantidade);
printf("Digite o preco do produto:");
scanf("%f", &preco);
raiz = inserir(raiz, codigo, nome, quantidade, preco);
break;
}
case 2: {
int codigoRemover;
printf("\nDigite o codigo do produto a ser removido:");
scanf("%d", &codigoRemover);
raiz = remover(raiz, codigoRemover);
break;
}
case 3: {
int codigoBuscar;
printf("\nDigite o codigo do produto a ser buscado:");
scanf("%d", &codigoBuscar);
Node* produtoBuscado = buscar(raiz, codigoBuscar);
if (produtoBuscado != NULL) {
printf("Produto encontrado:\n");
printf("Codigo: %d, Nome: %s, Quantidade: %d, Preco: R$ %.2f\n", produtoBuscado->codigo, produtoBuscado->nome, produtoBuscado->quantidade, produtoBuscado->preco);
} else {
printf("Produto com codigo %d nao encontrado!\n", codigoBuscar);
}
break;
}
case 4: {
float minPreco, maxPreco;
printf("\nDigite o preco minimo:");
scanf("%f", &minPreco);
printf("Digite o preco maximo:");
scanf("%f", &maxPreco);
printf("Produtos com preco entre R$ %.2f e R$ %.2f:\n", minPreco, maxPreco);
listarFaixaPreco(raiz, minPreco, maxPreco);
break;
}
case 5: {
int valor;
printf("\nDigite a quantidade maxima:");
scanf("%d", &valor);
printf("Produtos com quantidade menor que %d:\n", valor);
listarQuantidadeMenor(raiz, valor);
break;
}
case 6:
printf("\nValor total do estoque: R$ %.2f\n", calcularValorTotal(raiz));
break;
case 7:
printf("\nArvore de produtos:\n");
imprimirArvore(raiz, 0);
break;
default:
printf("Opcao invalida!\n");
}
} while (opcao != 0);
return 0;
}