Skip to content

Instantly share code, notes, and snippets.

@brunolpw
Last active Oct 30, 2020
Embed
What would you like to do?
#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

brunolpw commented Aug 26, 2017

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