Fila, pilha e lista encadeada

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

[ Hits: 16.577 ]

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

Arvores Red Black

2° mod do CGI

Derrubando Win9x/Win2k !

Arvore AVL

Entendendo a função fork()


  

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