Skip to content

Instantly share code, notes, and snippets.

@brunolpw
Last active October 30, 2020 17:22
Show Gist options
  • Select an option

  • Save brunolpw/c5d061ee57c47dfc3c5bc83874b7953a to your computer and use it in GitHub Desktop.

Select an option

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

brunolpw commented May 24, 2016

Copy link
Copy Markdown
Author

Lista em C.

@brunolpw

Copy link
Copy Markdown
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