Skip to content

Instantly share code, notes, and snippets.

@brunolpw
Last active October 30, 2020 17:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save brunolpw/c5d061ee57c47dfc3c5bc83874b7953a to your computer and use it in GitHub Desktop.
Save brunolpw/c5d061ee57c47dfc3c5bc83874b7953a to your computer and use it in GitHub Desktop.
#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;
}
}
}
#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
#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
# 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
@brunolpw
Copy link
Author

brunolpw commented May 24, 2016

Lista em C.

@brunolpw
Copy link
Author

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