Fila, pilha e lista encadeada
Publicado por Edmar Wantuil (última atualização em 27/10/2011)
[ Hits: 17.070 ]
Homepage: wantuil.com
Escrevi este script na faculdade para demostrar a utilização de fila, pilha e lista encadeada.
Pretendo futuramente escrever um artigo sobre o assunto.
/*
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;
}
Gerenciamento de Área de Alocação Dinâmica (Listas Encadeadas)
Contar elementos de uma lista encadeada
Árvore de busca binária com frequência de consultas
Jogo Simon (Genius) - com gráficos
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com som ruim no Pipewire
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Como programar um sistema de controle para distribuições linux em c? (4)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)









