enum elem_t {tipo_int, tipo_sublista};
union info_lista {
int i;
struct No* sublista;
};
typedef struct No {
enum elem_t tipo;
union info_lista info;
struct No* prox;
} No;
/* Cria um átomo com valor i e o concatena à lista l */
/* Retorna um apontador para a nova lista */
No* al(int i, No *l) {
No* n = (No*) malloc (sizeof(No));
n->tipo = tipo_int;
n->info.i = i;
n->prox = l;
return n;
}
/* Cria um nó com apontador para a sublista s e o concatena à lista l */
/* Retorna um apontador para a nova lista */
No* sl(No* s, No *l) {
No* n = (No*) malloc (sizeof(No));
n->tipo = tipo_sublista;
n->info.sublista = s;
n->prox = l;
return n;
}
/* Função f1: escreva ao lado a lista retornada. */
No *f1() {
return sl(al(1,al(2,sl(al(3,NULL),NULL))),sl(NULL,al(4,NULL)));
}
((1,2,(3)),(),4)
/* Deve retornar um apontador para (1,(2,()),(3),4) */
No *f2() {
No* l0 = al(2,sl(NULL,NULL)); /* (2,()) */
No* l1 = al(3,NULL); /* (3) */
return al(1,sl(l0,sl(l1,al(4,NULL))));
}
typedef struct no {
int v;
struct no *prox;
} No;
No* apenas_pares(No* l) {
if (l == NULL)
return NULL;
if (l->v % 2 == 0) {
No* n = malloc(sizeof(No));
n->v = l->v;
n->prox = apenas_pares(l->prox);
return n;
}
return apenas_pares(l->prox);
}
No* apenas_pares(No* l) {
if (l == NULL)
return NULL;
if (l->tipo == tipo_sublista) {
No* s = apenas_pares(l->info.sublista);
if (s != NULL) {
No* n = malloc(sizeof(No));
n->tipo = tipo_sublista;
n->info.sublista = s;
n->prox = apenas_pares(l->prox);
return n;
}
else
return apenas_pares(l->prox);
}
if (l->info.i % 2 == 0) {
No* n = malloc(sizeof(No));
n->tipo = tipo_int;
n->info.i = l->info.i;
n->prox = apenas_pares(l->prox);
return n;
}
else
return apenas_pares(l->prox);
}
#include <stdlib.h>
#include <stdio.h>
typedef struct no {
char c;
struct no* prox;
} No;
void inicia_valores(No* ap_n, char c, No* prox) {
ap_n->c = c;
ap_n->prox = prox;
}
int main() {
No n[2];
inicia_valores(&n[0], 'a', &n[1]);
inicia_valores(&n[1], 'b', &n[0]);
printf("1: %c\n", n[0].c);
printf("2: %c\n", n[0].prox->c);
printf("3: %c\n", n[1].prox->c);
printf("4: %c\n", n[1].prox->prox->c);
return 0;
}
A saída é:
1: a 2: b 3: a 4: b