Last active
October 30, 2020 17:22
-
-
Save brunolpw/c5d061ee57c47dfc3c5bc83874b7953a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "lista.h" | |
// Verifica se há algum elemento para ser ligado. | |
void verifica(node *lista){ | |
if(!lista){ | |
printf("Sem memoria suficiente.\n"); | |
exit(1); | |
} | |
} | |
// Inicia a lista com o primeiro elemento. | |
void iniciar(node *lista){ | |
lista->proximo = NULL; | |
} | |
// Gera o menu da aplicação. | |
void menu(node *lista){ | |
int op = -1; | |
while(op != 0){ | |
//system("cls"); | |
printf("\n0) Sair\ | |
\n1) Exibir lista\ | |
\n2) Adicionar node no inicio\ | |
\n3) Adicionar node no final\ | |
\n4) Remove node no inicio\ | |
\n5) Remove node no final\ | |
\n6) Zerar lista\ | |
\nOpcao: "); | |
scanf(" %d", &op); | |
switch(op){ | |
case 0:{ limpar(lista); break; } | |
case 1:{ imprime(lista); break; } | |
case 2:{ insere_inicio(lista); break; } | |
case 3:{ insere_final(lista); break; } | |
case 4:{ remove_inicio(lista); break; } | |
case 5:{ remove_final(lista); break; } | |
case 6:{ iniciar(lista); break; } | |
default: { printf("Comando invalido.\n"); break; } | |
} | |
} | |
} | |
// Verifica se realmente esta vazia. | |
short vazia(node *lista){ | |
if(lista->proximo == NULL){ return 1; } | |
return 0; | |
} | |
// Insere um novo elemento no inicio a lista. | |
void insere_inicio(node *lista){ | |
node *novo = aloca(); | |
node *old_head = lista->proximo; | |
lista->proximo = novo; | |
novo->proximo = old_head; | |
} | |
// Insere um novo elemento ao final da lista. | |
void insere_final(node *lista){ | |
node *novo = aloca(); | |
verifica(novo); | |
novo->proximo = NULL; | |
if(vazia(lista)){ lista-> proximo = novo; } | |
node *tmp = lista->proximo; | |
while(tmp->proximo != NULL){ | |
tmp = tmp->proximo; | |
} | |
tmp->proximo = novo; | |
} | |
node *aloca(){ | |
node *novo = (node *)malloc(sizeof(node)); | |
person *new_p = (person *)malloc(sizeof(person)); | |
printf("Novo nome: "); | |
scanf(" %255s", new_p->name); | |
if(!novo){ printf("Sem memoria.\n"); exit(1); } | |
novo->p = *new_p; | |
return novo; | |
} | |
// Remove o primeiro elemento da lista. | |
node *remove_inicio(node *lista){ | |
if(vazia(lista)){ return NULL; } | |
node *tmp = lista->proximo; | |
lista->proximo = tmp->proximo; | |
return lista; | |
} | |
// Remove o ultimo elemento da lista. | |
node *remove_final(node *lista){ | |
if(vazia(lista)){ return NULL; } | |
node *ultimo = lista->proximo, | |
*penultimo = lista; | |
while(ultimo->proximo != NULL){ | |
penultimo = ultimo; | |
ultimo = ultimo->proximo; | |
} | |
penultimo->proximo = NULL; | |
return ultimo; | |
} | |
// Imprime cada um dos elementos da lista. | |
void imprime(node *lista){ | |
if(vazia(lista)){ printf("Lista vazia.\n"); return ; } | |
node *tmp = lista->proximo; | |
while(tmp != NULL){ | |
printf("Nome: %s \n", tmp->p.name); | |
tmp = tmp->proximo; | |
} | |
printf("\n"); | |
} | |
// Limpa cada elemento da lista; | |
void limpar(node *lista){ | |
if(!vazia(lista)){ | |
node *prox_node, *atual; | |
atual = lista->proximo; | |
while(atual != NULL){ | |
prox_node = atual->proximo; | |
free(atual); | |
atual = prox_node; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#ifndef LISTA_H_ | |
#define LISTA_H_ | |
typedef struct Person | |
{ | |
char name[256]; | |
} person; | |
typedef struct Node | |
{ | |
person p; | |
struct Node *proximo; | |
} node; | |
void verifica(node *lista); | |
void iniciar(node *lista); | |
void menu(node *lista); | |
short vazia(node *lista); | |
void insere_inicio(node *lista); | |
void insere_final(node *lista); | |
node *aloca(); | |
node *remove_inicio(node *lista); | |
node *remove_final(node *lista); | |
void imprime(node *lista); | |
void limpar(node *lista); | |
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "lista.h" | |
int main() | |
{ | |
node *lista = (node*)malloc(sizeof(node)); | |
verifica(lista); | |
iniciar(lista); | |
menu(lista); | |
free(lista); | |
return 0; | |
} | |
//Todas as coisas cooperam para o bem daqueles que amam a Deus. Rm 8:28 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# makefile de listas. | |
all: lista | |
rm *.o | |
./lista.exe # ./lista #- caso esteja no linux. | |
lista: lista.o lista_completa.o | |
gcc -o lista.exe lista.o lista_completa.o -Wall #gcc -o lista lista.o lista_completa.o -Wall #- caso esteja no linux. | |
lista.o: lista.c lista.h | |
gcc -o lista.o -c lista.c -Wall | |
lista_completa.o: lista_completa.c lista.h | |
gcc -o lista_completa.o -c lista_completa.c -Wall |
Um exercício de lista duplamente encadeada em C.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Lista em C.