2 de ago. de 2010

Resolução de Exercícios: Pilhas e Filas

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");
}

image

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");
}

image

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 Alegre

3 comentários:

Anônimo disse...

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...

E. S. Bentes disse...

O erro aponta para a linha 15:
Aluno aluno;

Willian disse...

por favor me explique como implentar uma pilha usando dua s filas e vice-versa