Nos posts anteriores sobre pilhas e filas dinâmicas, foram propostos a implementação das estruturas com uma struct de Aluno.
Pois bem, aqui esta com a resolução…
Pilha:
#include <stdio.h>
#include <stdlib.h>
struct Aluno
{
int ra;
char nome[50];
};struct Item
{
Aluno aluno;
Item *proximo;
};
void Inicializar(Item **topo)
{
*topo = NULL;
}bool EstaVazia(Item **topo)
{
if(*topo == NULL)
return true;
else
return false;
}void Empilhar(Item **topo, Aluno elemento)
{
Item *novo;
novo = (Item *)malloc(sizeof(Item));
novo->aluno = elemento;
novo->proximo = *topo; // -> próximo recebe o elemento que estava no topo.
*topo = novo;
}Aluno Desempilhar(Item **topo)
{
Aluno result;
Item *auxiliar;
if(EstaVazia(topo))
{
printf("\n stack underflow! \n");
exit(1);
}
else // -> Elemento retirado do topo
{
result = (*topo)->aluno;
auxiliar = *topo;
*topo = (*topo)->proximo;
free(auxiliar);
return result;
}
}void MostrarPilha(Item *topo)
{
int i = 0;
Item *item;
printf("\n\n Listando...\n\n");
printf("---------------------------------\n");if (EstaVazia(&topo))
{
printf ("A Pilha esta vazia!\n");
}
else
{
item = topo;while(item != NULL)
{
i++;
printf("[%i] -> %i - %s\n", i, item->aluno.ra, item->aluno.nome);
item = item->proximo;
}
}printf("---------------------------------\n");
}
void Menu()
{
printf( "Digite a sua escolha: \n"
" 1 empilhar elemento \n"
" 2 desempilhar \n"
" 3 para finalizar \n"
"? ");
}
void main()
{
Item *topo = NULL;
int opcao;
Aluno aluno;Menu();
scanf("%i", &opcao);while (opcao != 3)
{switch (opcao)
{
case 1:
printf( "Digite um RA: ");
scanf("\n%i", &aluno.ra);printf( "Digite um Nome: ");
scanf("\n%s", &aluno.nome);Empilhar(&topo, aluno);
MostrarPilha(topo);break;
case 2:
Desempilhar(&topo);
MostrarPilha(topo);break;
default:
printf( "Escolha invalida.\n\n");
Menu();
break;
}scanf("%i", &opcao);
}system("pause");
}
Fila:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct Aluno
{
int ra;
char nome[50];
};struct Item
{
Aluno aluno;
struct Item *proximo;
};struct Fila
{
Item *inicio;
Item *fim;
};
void Inicializar(Fila **fila)
{
// -> Recebe a fila por referencia
// para inicializá-la
*fila = (Fila *) malloc(sizeof(Fila));
(*fila)->inicio = NULL;
(*fila)->fim = NULL;
}int EstaVazia(Fila *fila)
{
return fila->inicio == NULL;
}void Inserir(Fila *fila, Aluno elemento)
{
Item *novo;
novo = (Item *)malloc(sizeof(Item));// -> Verifica se a memória foi alocada com sucesso
if (novo != NULL)
{
strcpy(novo->aluno.nome, elemento.nome);
novo->aluno.ra = elemento.ra;
novo->proximo = NULL;if(EstaVazia(fila))
{
// -> Primeiro Item da Fila.
fila->inicio = novo;
fila->fim = novo;
}
else
{
// -> Ultimo item da Fila
fila->fim->proximo = novo;
fila->fim=novo;
}
}
}void Retirar(Fila *fila)
{
Item *item;if(!EstaVazia(fila))
{
item = fila->inicio;
fila->inicio = item->proximo;
free(item);// -> Se a fila acabou devemos atualizar o final
if (fila->inicio == NULL)
fila->fim = NULL;
}
}void MostrarFila(Fila *fila)
{
int i = 0;
Item *item;
printf("\n\n Listando...\n\n");
printf("---------------------------------\n");if (EstaVazia(fila))
{
printf ("A Fila esta vazia!\n");
}
else
{
item = fila->inicio;while(item != NULL)
{
i++;
printf("[%i] -> %i - %s\n", i, item->aluno.ra, item->aluno.nome);
item = item->proximo;
}
}printf("---------------------------------\n");
}
void Menu()
{
printf( "Digite a sua escolha: \n"
" 1 enfileirar elemento \n"
" 2 retirar da fila \n"
" 3 para finalizar \n"
"? ");
}
void main()
{
Fila *fila = NULL;
int opcao;
Aluno aluno;Inicializar(&fila);
Menu();
scanf("%i", &opcao);while (opcao != 3)
{switch (opcao)
{
case 1:
printf( "Digite um RA: ");
scanf("\n%i", &aluno.ra);printf( "Digite um Nome: ");
scanf("\n%s", &aluno.nome);Inserir(fila, aluno);
MostrarFila(fila);break;
case 2:
Retirar(fila);
MostrarFila(fila);break;
default:
printf( "Escolha invalida.\n\n");
Menu();
break;
}scanf("%i", &opcao);
}system("pause");
}
Vale prestar atenção nos métodos de inserção. Na pilha é copiado o elemento de uma vez, na fila é copiado item a item da struct. Isso é só para exemplificar que das duas maneira é possível. Lembrem-se: para copiar strings utilizem a função da linguagem C strcpy(destino, origem).
Agora fica o desafio:
- Validem a inclusão na estrutura para que não contenha RA repetido. A busca deve ser feito com o método de retirar elementos da estrutura!
Boa sorte
3 comentários:
Bom tentei copiar e colar, e não deu certo; estou estudando estas estruturas mas até até agora não vi nenhuma aplicação pratica; só teoria é meio cansativo...
O erro aponta para a linha 15:
Aluno aluno;
por favor me explique como implentar uma pilha usando dua s filas e vice-versa
Postar um comentário