Last active
August 29, 2015 14:11
-
-
Save marcoonroad/8e1227ba007daad91353 to your computer and use it in GitHub Desktop.
Outro trabalho de AL2...
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> | |
// tipos | |
typedef struct node { | |
int here; | |
struct node *next; | |
} Node; | |
typedef Node * Linked; | |
// função para alocação automática | |
Linked new (int x, Linked xs) { | |
Linked ys = malloc (sizeof (Node)); | |
if (ys == NULL) { | |
puts ("Erro! Não foi possível usar alguma memória..."); | |
exit (EXIT_FAILURE); | |
} | |
ys -> here = x; | |
ys -> next = xs; | |
return ys; | |
} | |
// gera uma nova lista com dado número e outra lista | |
Linked cons (int x, Linked xs) { | |
Linked ys = new (x, xs); | |
return ys; | |
} | |
// alias para extração de dados nas listas | |
int head (Linked xs) { return xs -> here; } | |
Linked tail (Linked xs) { return xs -> next; } | |
// transforma um vetor em uma lista encadeada | |
Linked linka (int vetor[ ], int tamanho) { | |
Linked xs = NULL; | |
while (tamanho) | |
xs = cons (vetor[ --tamanho ], xs); | |
return xs; | |
} | |
// espécie de 'foreach' keyword conhecida em outras linguagens | |
void foreach (Linked xs, void (* f)( )) { | |
Linked ys = xs; | |
while (ys) { | |
(* f)(head (ys)); | |
ys = tail (ys); | |
} | |
} | |
// função que printa dado número | |
void say (int x) { printf ("%d ", x); } | |
// função para remover um número da lista | |
Linked retira (int x, Linked xs) { | |
Linked ys = xs; | |
Linked zs = tail (ys); | |
if (x == head (ys)) { | |
xs = zs; | |
free (ys); | |
return xs; | |
} | |
while (zs) { | |
if (x < head (zs)) | |
break; | |
if (x == head (zs)) { | |
Linked as = tail (zs); | |
ys -> next = as; | |
free (zs); | |
return xs; | |
} | |
ys = tail (ys); | |
zs = tail (zs); | |
} | |
puts ("Número não encontrado..."); | |
return xs; | |
} | |
// função para inserir x número na lista | |
Linked insere (int x, Linked xs) { | |
Linked ys = xs; | |
Linked zs = tail (ys); | |
if (x < head (ys)) { | |
Linked as = new (x, ys); | |
xs = as; | |
return xs; | |
} | |
while (ys) { | |
if ((head (ys) < x && !zs) || (head (ys) < x && x < head (zs))) { | |
Linked as = new (x, zs); | |
ys -> next = as; | |
return xs; | |
} | |
ys = tail (ys); | |
zs = tail (zs); | |
} | |
puts ("Impossível adicionar número..."); | |
return xs; | |
} | |
// testes | |
int main ( ) { | |
int L[ ] = { 2, 6, 9, 15, 20 }; | |
Linked K = linka (L, 5); | |
puts ("Valores iniciais: "); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Inserindo 10: "); | |
K = insere (10, K); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Removendo 2: "); | |
K = retira (2, K); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Removendo 14?"); | |
K = retira (14, K); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Inserindo 25..."); | |
K = insere (25, K); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Inserindo 1."); | |
K = insere (1, K); | |
foreach (K, &say); | |
puts ("\n"); | |
puts ("Removendo 20:"); | |
K = retira (20, K); | |
foreach (K, &say); | |
puts ("\n"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment