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 exemplo: retorna um apontador para ((1)) */
No *exemplo() {
return sl(al(1, NULL), NULL);
}
/* Retorna um apontador para ((1, 2, (3)), 4) */
/* Dica: use variáveis auxiliares para compor a lista */
No *retorna_lista() {
No* l0 = sl(al(3, NULL), NULL); /* ((3)) */
No* l1 = al(2, l0); /* (2, (3)) */
No* l2 = al(1, l1); /* (1, 2, (3)) */
No* l3 = al(4, NULL); /* (4) */
return sl(l2, l3); /* ((1, 2, (3)), 4) */
}
/* Retorna um apontador para ((1, (2), 3), 4) */
/* Dica: use variáveis auxiliares para compor a lista */
No *retorna_lista() {
No* l0 = al(3, NULL); /* (3) */
No* l1 = al(2, NULL); /* (2) */
No* l2 = sl(l1, l0); /* ((2), 3) */
No* l3 = al(1, l2); /* (1, (2), 3) */
No* l4 = al(4, NULL); /* (4) */
return sl(l3, l4); /* ((1, (2), 3), 4) */
}
/* Retorna um apontador para ((1, 2, 3), (4)) */
/* Dica: use variáveis auxiliares para compor a lista */
No *retorna_lista() {
No* l0 = sl(al(4, NULL), NULL); /* ((4)) */
No* l1 = al(3, NULL); /* (3) */
No* l2 = al(2, l1); /* (2, 3) */
No* l3 = al(1, l2); /* (1, 2, 3) */
return sl(l3, l0); /* ((1, 2, 3), (4)) */
}
/* Retorna um apontador para (((1), 2, 3), 4) */
/* Dica: use variáveis auxiliares para compor a lista */
No *retorna_lista() {
No* l0 = al(1, NULL); /* (1) */
No* l1 = al(3, NULL); /* (3) */
No* l2 = al(2, l1); /* (2, 3) */
No* l3 = sl(l0, l2); /* ((1), 2, 3) */
No* l4 = al(4, NULL); /* (4) */
return sl(l3, l4); /* (((1), 2, 3), 4) */
}
typedef struct no {
int v;
struct no *prox;
} No;
No* remove_zeros(No* l) {
if (l == NULL)
return NULL;
if (l->v == 0) {
No* r = l;
l = l->prox;
free(r);
return remove_zeros(l);
}
else{
l->prox = remove_zeros(l->prox);
return l;
}
}
No* remove_zeros(No* l) {
if (l == NULL)
return NULL;
if (l->tipo == tipo_sublista)
l->info.sublista = remove_zeros(l->info.sublista);
else
if (l->info.i == 0) {
No* r = l;
l = l->prox;
free(r);
return remove_zeros(l);
}
l->prox = remove_zeros(l->prox);
return l;
}
1: #include2: #include 3: 4: typedef struct no { 5: char c; 6: struct no* prox; 7: } No; 8: 9: typedef No *Pilha; 10: 11: void cria_pilha(Pilha *p) { 12: p = NULL; 13: } 14: 15: void empilha(Pilha *p, char *c) { 16: No *n = (No *) malloc (sizeof (No)); 17: n->c = *c; 18: n->prox = p; 19: p = &n; 20: } 21: 22: int main() { 23: Pilha *p; 24: char *c; 25: 26: cria_pilha(p); 27: scanf("%c ", c); 28: empilha (p, c); 29: return 0; 30: }
Pilha p;ou
Pilha *p = malloc (sizeof(Pilha));
1: #include2: #include 3: 4: typedef struct no { 5: char c; 6: struct no* prox; 7: } No; 8: 9: typedef No *Pilha; 10: 11: void cria_pilha(Pilha *p) { 12: *p = NULL; 13: } 14: 15: void empilha(Pilha *p, char *c) { 16: No *n = (No *) malloc (sizeof (No)); 17: n->c = *c; 18: n->prox = *p; 19: *p = n; 20: } 21: 22: int main() { 23: Pilha p; 24: char c; 25: 26: cria_pilha(&p); 27: scanf("%c ", &c); 28: empilha (&p, &c); 29: return 0; 30: }