viciado 1 Denunciar post Postado Setembro 21, 2009 Lista que os números ímpares fiquem no início e o pares no final da lista. A função inserir devolve número inserido ou 0 (caso haja erro), a função retirar o mesmo devolve o número retira ou 0. #include <stdio.h> #include <stdlib.h> typedef struct lista{ int n; struct lista *prox; }LISTA; void inic(LISTA **L){ *L = NULL; } int inserir(LISTA **L, int n){ LISTA *tmp; if(n%2!=0 || *L==NULL){ tmp = (LISTA*) malloc(sizeof(LISTA)); if(tmp==NULL) return 0; tmp->n = n; tmp->prox = *L; *L = tmp; return n; } else return inserir(& (**LISTA).prox, n); // Estou com erro de sntaxe aqui } int retirar(LISTA **L, int n){ LISTA *tmp; if(*L==NULL) return 0; if((*L)->n != n) retirar(&(*L)->prox,n); else{ int retorna = (*L)->n; tmp = *L; *L = (*L)->prox; free(tmp); //Vi na internet que precisava liberar essa variável, pq ? return retorna; } } void print(LISTA *L){ if(L==NULL) puts("Lista vazia"); else{ printf("%d \n",L->n); } print(L->prox); } int main() { LISTA *l; inserir(&l,17); inserir(&l,10); inserir(&l,8); inserir(&l,7); inseir(&l,20); retirar(&l,10); print(&l); system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Setembro 21, 2009 Meu, se tu tá usando lista ligada não precisa usar ponteiro pra ponteiro nas funções. Declara como ponteiro normal e passa o elemento da lista lá normal. Aí naquele teu erro de sintaxe ali tu só ia precisar de return inserir(**LISTA->prox, n); E sobre liberar variáveis, tu sempre tem que liberar o espaço dos ponteiros alocados dinamicamente quando tu não vai mais usar eles no programa (ex. no final de uma função ou quando deleta de uma lista). Se tu não liberar, vai causar memory leaks. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 21, 2009 Meu, se tu tá usando lista ligada não precisa usar ponteiro pra ponteiro nas funções. Declara como ponteiro normal e passa o elemento da lista lá normal. Aí naquele teu erro de sintaxe ali tu só ia precisar de return inserir(**LISTA->prox, n); E sobre liberar variáveis, tu sempre tem que liberar o espaço dos ponteiros alocados dinamicamente quando tu não vai mais usar eles no programa (ex. no final de uma função ou quando deleta de uma lista). Se tu não liberar, vai causar memory leaks. Não adiantou: return inserir(**LISTA->prox, n); Continua o mesmo erro. Como não preciso usar ponteiro para ponteiro se eu tenho que inserir e retirar da lista ? Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Setembro 22, 2009 Opa foi mal, deixei duas letrinhas ali return inserir(LISTA->prox, n); Isso que eu quis dizer ; Tu só precisa de ponteiro normal para trabalhar com lista. Ponteiro para ponteiro tu usa, por exemplo, em uma array bidimensional. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 22, 2009 Opa foi mal, deixei duas letrinhas ali return inserir(LISTA->prox, n); Isso que eu quis dizer ; Tu só precisa de ponteiro normal para trabalhar com lista. Ponteiro para ponteiro tu usa, por exemplo, em uma array bidimensional. Continua o mesmo problema: int inserir(LISTA **L, int n){ LISTA *tmp; if(n%2!=0 || *L==NULL){ tmp = (LISTA*) malloc(sizeof(LISTA)); if(tmp==NULL) return 0; tmp->n = n; tmp->prox = *L; *L = tmp; return n; } else return inserir(LISTA->prox, n); } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 22, 2009 Ja tentou assim?? return (&((*L)->prox), n); Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Setembro 22, 2009 Ja tentou assim?? return (&((*L)->prox), n); Agora sim. Obrigado Compartilhar este post Link para o post Compartilhar em outros sites