Skip to content

Instantly share code, notes, and snippets.

@marcoonroad
Last active August 29, 2015 14:11
Show Gist options
  • Save marcoonroad/8e1227ba007daad91353 to your computer and use it in GitHub Desktop.
Save marcoonroad/8e1227ba007daad91353 to your computer and use it in GitHub Desktop.
Outro trabalho de AL2...
#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