Declaração das bibliotecas, da estrutura da lista de produtos e dos protótipos das
funções implementadas:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char codigoBarras[8];
char descricao[20];
float preco;
int categoria;
} Produto;
struct Nodo{
Produto dado;
struct Nodo *prox;
};
typedef struct Nodo nodo;
void instancia(Produto *, char *, char *, float, int);
void iniciar(nodo *);
int estaVazia(nodo *);
void inserirOrdenado(nodo *, Produto *);
void imprimir(nodo *);
void liberar(nodo *);
Implementação da função instância que insere os dados na estrutura Produto:
void instancia(Produto *produto, char *codigoBarras, char *descricao,
float preco, int categoria){
strcpy(produto->codigoBarras, codigoBarras);
strcpy(produto->descricao, descricao);
produto->preco= preco;
produto->categoria= categoria;
}
Implementação da função que inicia a lista:
void iniciar(nodo *L) {
L->prox= NULL;
}
Implementação da função que verifica se a lista está vazia:
int estaVazia(nodo *L) {
if (L->prox == NULL)
return 1;
else
return 0;
}
Implementação da função que imprime a lista de produtos:
void imprimir(nodo *L) {
if (estaVazia(L)) {
printf("Lista vazia!\n\n");
return;
}
nodo *no= L->prox;
printf("%-8s %s \t%s %s \n",
"Codigo", "Descricao", "Valor", "Categoria");
while(no != NULL){
printf("%-8s %s \t%-6.2f %d \n",
no->[Link], no->[Link],
no->[Link], no->[Link]);
no= no->prox;
}
printf("\n\n");
}
Implementação da função que exclui a lista depois da execução do programa:
void liberar(nodo *L) {
nodo *proximo;
nodo *atual;
atual= L;
while(atual->prox != NULL){
proximo= atual->prox;
atual->prox= NULL;
free(atual);
atual= proximo;
}
}
Implementação da função que insere os dados ordenados na lista:
Inicialmente esse método verifica se a lista está vazia para inserir no início e, caso negativo,
realiza uma varredura na lista para identificar a posição correta de inserção do elemento na ordem
classificada.
Na sequência, identifica se o novo elemento será inserido no início da lista ou em qualquer
outra posição.
void inserirOrdenado(nodo *L, Produto *dado) {
nodo *novo= (nodo *) malloc(sizeof(nodo));
strcpy(novo->[Link], dado->codigoBarras);
strcpy(novo->[Link], dado->descricao);
novo->[Link] = dado->categoria;
novo->[Link] = dado->preco;
if (estaVazia(L)) {
novo->prox= NULL;
L->prox= novo;
} else {
nodo *tmp= NULL;
nodo *ant= NULL;
nodo *no= L->prox;
char desc[20];
int pos= 0;
while(no != NULL) {
if (dado->preco > no->[Link]) {
pos++;
}
no= no->prox;
}
if (pos == 0) {
tmp= L->prox;
L->prox= novo;
novo->prox= tmp;
} else {
int p= 0;
no= L->prox;
while(no != NULL) {
p++;
if (p == pos) {
tmp= no->prox;
no->prox= novo;
novo->prox= tmp;
break;
}
no= no->prox;
}
}
}
}
Implementação do método principal:
main() {
Produto produto;
nodo *L= (nodo *) malloc(sizeof(nodo));
iniciar(L);
instancia(&produto, "9874811", "Alcatra", 30.00, 3);
inserirOrdenado(L, &produto);
instancia(&produto, "9874651", "Alvejante", 2.50, 2);
inserirOrdenado(L, &produto);
instancia(&produto, "9878145", "Massa fina", 2.95, 1);
inserirOrdenado(L, &produto);
instancia(&produto, "9878145", "Massa grossa", 3.94, 1);
inserirOrdenado(L, &produto);
instancia(&produto, "9878145", "Batata doce", 2.55, 1);
inserirOrdenado(L, &produto);
instancia(&produto, "9878145", "Batata branca", 1.59, 1);
inserirOrdenado(L, &produto);
imprimir(L);
liberar(L);
}