Fila, pilha e lista encadeada

Publicado por Edmar Wantuil (última atualização em 27/10/2011)

[ Hits: 17.005 ]

Homepage: wantuil.com

Download lista.c




Escrevi este script na faculdade para demostrar a utilização de fila, pilha e lista encadeada.

Pretendo futuramente escrever um artigo sobre o assunto.

  



Esconder código-fonte

/*
  Feito por Edmar Wantuil Silva Júnior
  Em 2011
*/
#include  <stdio.h>
#include  <stdlib.h>

//Função  para  pausar  a  tela
void  pause_screen()
{
  printf("\nAperte  enter  para  continuar...");
  getchar();
  getchar();
}

//Função  para  limpar  a  tela
void  clear_screen()
{
  system("clear");
}

//Estrutura  para  dados
typedef  struct  data
{
  int  number;
  //ponteiro  para  o  proximo  item  do  array
  struct  data  *next;
}  datas;

//ponteiros  para  o  primeiro  dado  e  o  ultimo  dado
struct  data  *begin,  *end;

void  eguals(int  number,  int  size)
{
  int  cont=  10;
  while(size  >=  cont)
  {
    if(cont  >  number)
      printf("0");
    cont=  cont  *  10;
  }
}

//Contator  para  todos  os  dados  do  array
int  all_data=  0;

void  clear_data()
{
  struct  data  *temp;
  temp=  begin;
  while(temp  !=  NULL)
  {
    begin=  temp->next;
    free(temp);
    temp=  begin;
  }
  begin=  NULL;
  end=  NULL;
  all_data=  0;
}

//Função  para  adicionar  item  no  array
void  add_data()
{
  clear_screen();
  //ler  o  numero  e  o    salva  em  uma  variavel  temporaria
  int  input=  0;
  printf("Adicionar\n");
  printf("  Numero:  ");
  scanf("%d",  &input);
  //se  não  for  o  primeiro  numero  fara...  
  if(all_data  !=  0)
  {
    struct  data  *temp;
    temp=  malloc  (sizeof  (datas));
    temp->next=  NULL;
    temp->number=  input;
      end->next=  temp;
    end=  temp;
    all_data++;
  }
  //se  for  o  primeiro
  else
  {
    begin=  malloc(sizeof(datas));
    begin->next=  NULL;
    begin->number=  all_data  +  1;
    end=begin;
    all_data++;
  }
  clear_screen();
  //printf("Dado  adicionado  com  sucesso!");
  //pause_screen();
}

//deleta  endereço  recebido  por  paramento
int  delete_data(struct  data  *delete)
{
  clear_screen();
  if(delete  ==  begin)
  {
    begin=  begin->next;
    free(delete);
    all_data--;
    return  0;
  }
  else
  {
    struct  data  *temp;
    temp=  begin;
    while(1)
    {
      if(temp->next  ==  delete)
      {
        temp->next=  temp->next->next;
        if(delete  ==  end)
           end=  temp;
        free(delete);
        all_data--;
        end=  temp;
        return  0;
      }
      temp=  temp->next;
    }  
  }
  return  1;
}

//mostra  o  array  dado
void  show_data()
{
  if(all_data  !=  0)
  {
    struct  data  *temp;
    int  cont=  1;
    temp=  begin;
    while(temp  !=  NULL)
    {
      printf("  ");
      eguals(temp->number,  all_data);
      printf("%d  -  %d\n",  cont,  temp->number);
      temp=  temp->next;
      cont++;
    }
  }
  else
    printf("Sua  lista  está  vazia!!!");
}

//Procura  um  valor  no  array  de  dados
void  search_data()
{
  clear_screen();
  printf("Pesquisar\n");
  printf("Procura  por:  ");
  int  search=  0;
  scanf("%d",  &search);
  struct  data  *temp;
  temp=  begin;
  int  cont=  1;
  int  found=  0;
  //Percore  todo  o  array  e  quando  o  valor  encrotando  exibi  na  tela
  while(temp  !=  NULL)
  {
    if(search  ==  temp->number)
    {
      printf("  %d  -  %d\n",  cont,  temp->number);
      found++;
    }
    temp=  temp->next;
    cont++;
  }
  if(found  >=  1)
    printf("  Foi  encrotado(s)  %d  dado(s).",  found);
  else
    printf("  Nenhum  dado  encrotado.");
  pause_screen();
}

//Função  para  buscar  o  endereço  de  memoria  a  ser  excluido
void  search_delete()
{
  clear_screen();
  printf("Deletar  dado\n");
  printf("  Deletar  dado  com  o  numero=  ");
  int  search=  0;
  scanf("%d",  &search);
  struct  data  *temp;
  temp=  begin;
  int  found=  0;
  //Roda  o  array  de  dados  todo
  while(temp  !=  NULL)
  {
    //Quando  achar  o  numero  a  ser  excluido  chama  a  função  para  deletar  passando  o  endereço  do  dado  a  ser  excluido
    if(search  ==  temp->number)
    {
      delete_data(temp);
      found++;
    }
    temp=  temp->next;
  }
  if(found  >  0)
    printf("Dado  deletado  com  sucesso!");
  else
    printf("Nenhum  dado  deletado");
  pause_screen();
}

//Menu  fila
int  menu_file()
{
  clear_screen();
  int  option=  0;
  printf("      Menu  Fila\n");
  printf("  1-  Adicionar\n");
  printf("  2-  Excluir\n");
  printf("  3-  Exibir\n");
  printf("  4-  Pesquisar\n");
  printf("  5-  Sair\n");
  printf("Opcao:  ");
  scanf("%d",  &option);
  switch  (option)
  {
    case  1:
      add_data();
    break;
    case  2:
      if(delete_data(begin)  ==  0)
        printf("Dado  deletado  com  sucesso!");
      else
        printf("Nenhum  dado  deletado");
      pause_screen();
    break;
    case  3:
      clear_screen();
      printf("Estado  atual  da  fila\n");
      show_data();
      pause_screen();
    break;
    case  4:
      search_data();
    break;
    case  5:
      clear_data();
    break;
    default:
      clear_screen();
      printf("Opcao  invalida!");
      pause_screen();
    break;
  }
  return  option;
}

//Menu  pilha
int  menu_stack()
{
  clear_screen();
  int  option=  0;
  printf("      Menu  Pilha\n");
  printf("  1-  Adicionar\n");
  printf("  2-  Excluir\n");
  printf("  3-  Exibir\n");
  printf("  4-  Pesquisar\n");
  printf("  5-  Sair\n");
  printf("Opcao:  ");
  scanf("%d",  &option);
  switch  (option)
  {
    case  1:
      add_data();
    break;
    case  2:
      if(delete_data(end)  ==  0)
        printf("Dado  deletado  com  sucesso!");
      else
        printf("Nenhum  dado  deletado");
      pause_screen();
    break;
    case  3:
      clear_screen();
      printf("Estado  atual  da  fila\n");
      show_data();
      pause_screen();
    break;
    case  4:
      search_data();
    break;
    case  5:
       clear_data();
    break;
    default:
      clear_screen();
      printf("Opcao  invalida!");
      pause_screen();
    break;
  }
  return  option;
}

//Menu  lista
int  menu_list()
{
  clear_screen();
  int  option=  0;
  printf("      Menu  Pilha\n");
  printf("  1-  Adicionar\n");
  printf("  2-  Excluir\n");
  printf("  3-  Exibir\n");
  printf("  4-  Pesquisar\n");
  printf("  5-  Sair\n");
  printf("Opcao:  ");
  scanf("%d",  &option);
  switch  (option)
  {
    case  1:
      add_data();
    break;
    case  2:
      search_delete();
    break;
    case  3:
      clear_screen();
      printf("Estado  atual  da  fila\n");
      show_data();
      pause_screen();
    break;
    case  4:
      search_data();
    break;
    case  5:
       clear_data();
    break;
    default:
      clear_screen();
      printf("Opcao  invalida!");
      pause_screen();
    break;
  }
  return  option;
}

//Menu  principal
int  menu()
{
  clear_screen();
  printf("Menu  Principal\n");
  printf("  1  -  Fila\n");
  printf("  2  -  Pilha\n");
  printf("  3  -  Lista\n");
  printf("  4  -  Sair\n");
  printf("  Opcao:  ");
  int  option=  0;
  scanf("%d",  &option);
  switch  (option)
  {
    case  1:
      while(menu_file()  !=  5);
    break;
    case  2:
      while(menu_stack()  !=  5);
    break;
    case  3:
      while(menu_list()  !=  5);
    break;
    case  4:
      clear_screen();
      printf("Até  logo!");
      pause_screen();
    break;
    default:
      clear_screen();
      printf("Opcao  invalida!");
      pause_screen();
    break;
  }
  return  option;
}

//Função  principal
int  main()
{
  while(menu()  !=  4);
  return  0;
}

Scripts recomendados

Ordenar um lista estática sequencial básica (bubblesort)

BINCON 10

Rotina para controle de portas paralelas em C.

Árvore AVL, usando arquivos para armazenamento de dados

Jogo Windows Invaders (com gráficos)


  

Comentários
[1] Comentário enviado por presidente em 02/11/2011 - 17:00h

Então, isso é um código fonte, e não um script.

Scripts geralmente estão associados a linguagens que são interpretadas, e no caso do C temos uma linguagem compilada. A forma correta de se referir ao sua codificação é "código-fonte".

De qualquer forma, ele esta bem escrito e parabéns. Seria legal ver o seu artigo.

Saudações

[2] Comentário enviado por OrgulhoGeek em 05/11/2011 - 00:23h

Wantu, estou estudando Fila e Listas agora na facul. Fiz um código bem comentadinho do que estou aprendendo. Estou compartilhando abaixo:

#include<stdio.h>
#include<stdlib.h>

// ------------------------------
// estrutura de criação de elementos

typedef struct nofila{

int valor; // recebe um valor dentro do elemento
struct nofila *prox; // aponta para o elemento anterior da fila


}NoFila;

//-----------------------------
// estrutura de controle da fila

typedef struct fila{

NoFila *prim; // aponta para o primeiro elemento da fila
NoFila *ult; // aponta para o último elemento da fila

}Fila;

//-------------------------------
// criação de uma nova fila

Fila *NovaFila()
{

Fila *f == malloc(sizeof(Fila)); /* declaração de um ponteiro que recebe o tamanho do tipo Fila */

f -> prim = NULL; // o ponteiro "prim" recebe nulo
f -> ult = NULL; // o ponteiro "ult" tambem recebe nulo

return f;

}


//-----------------------------------
// verificação de fila vazia

int FilaVazia(Fila *f)
{

if(f -> prim == NULL)

return 1; // verdadeiro

else

return 0; // falso

}


//-----------------------------------
// inserção de elementos na fila

Fila *push(Fila *f, int elem)
{

NoFila *novo=malloc(sizeof(NoFila)); /* criação de um novo elemento recebendo o tamanho do tipo NoFila */

novo->valor = elem; /* o campo "valor" do novo elemento recebe o conteúdo da var elem */
novo->prox = NULL; /* o campo "prox" do novo elemento aponta para NULL */

if(FilaVazia(f)) /* verificação necessária para inserir o novo elemento. Se a fila estiver vazia */
{

f->prim = novo; /* o campo "prim" da estrura de controle aponta para o novo elemento */
f->ult = novo; /* o campo "ult" da estrutura de controle apónta para o novo elemento */

return f;

}
else /* se a fila não estiver vazia */
{

f->ult->prox = novo; /* a estrutura de controle aponta "ult" para o campo prox do elemento existente,
que recebe o novo elemento */
f->ult = novo; /* a estrutura aponta o campo "ult" para o novo elemento */

return f;
}
}


//-----------------------------------
// remoção de elementos da fila

Fila *pop(Fila *f)
{

if(FilaVazia(f)) /* verificação de estado da fila. Se a fila estiver vazia... */
{

printf("\nErro! Sua fila está vazia!"); /* ...imprima mensagem de erro */
return f; /* retorne f */
}
else /* se não estiver vazia... */
{

NoFila *temp = f->prim; /* crie um ponteiro temporário que recebe o o apontador "prim" da estrutura de controle */

if(f->prim == f->ult) /* -->> se o apontador "prim" da estrutura de controle for igual ao "ult"... */
{ /* ... quer dizer que só há um elemento na fila */

free(temp); /* libere o ponteiro temporário e o elemento será apagado */
f->prim=f->ult=NULL; /* faça "prim" e "ult" apontar para NULL, assim, a fila volta a ficar vazia */
}
else /* -->> senão (se "prim" não for igual a "ult"... */
{

f->prim = temp->prox; /* o apontador "prim" da estrutura de controle aponta para o próximo elemento que temp aponta */
free(temp); /* libere temp e o primeiro elemento será apagado */
}

}

return f;

}


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts