Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

viciado

[Resolvido] Lista

Recommended Posts

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.