Lista Encadeada C

Comecei a fazer um programa de lista encadeada, mas quando uso a função imprimir, ele não estava imprimindo nada, dai decobri que a LISTA depois que sai da função insere, ela volta a ter o valor NULL e eu não sei porque.

	#include <stdio.h>
	#include <stdlib.h>
	
	struct Node {
	 int num;
	 struct Node *prox;
	};
	typedef struct Node node;
	 
	node* aloca();
	void inicia(node *LISTA);
	void insere(node *LISTA, int val);
	void imprime(node *LISTA);
	
	int main(void) {
	  node *LISTA = NULL;
	  inicia(LISTA);
	  insere(LISTA, 10);
	  insere(LISTA, 20);
	  insere(LISTA, 5);
	  imprime(LISTA);
	
	  return 0;
	}
	
	node* aloca() {
	  node *LISTA = (node *)malloc(sizeof(node));
	  return(LISTA);
	}
	
	void inicia(node *LISTA) {
	  LISTA = NULL;
	}
	
	void insere(node *LISTA, int val) {
	  node *p1 = aloca();
	  node *p2;
	  
	  p1->num = val;
	  p1->prox = NULL;
	
	  if (LISTA == NULL) {
	    LISTA = p1;
	  }else {
	    p2 = LISTA;
	    while (p2->prox != NULL) {
	      p2 = p2->prox;
	      p2->prox = p1;
	    }
	  }
	}
	
	void imprime(node *LISTA) {
	  node *tmp;
	  tmp = LISTA;
	  while(tmp != NULL) {
	    printf("%d", tmp->num);
	    tmp = tmp->prox;
	  }
	}

Não sei porque a lista está virando NULL, mas achei um problema no teu algoritmo de inserção

Quando a lista possui um único elemento, seu next é NULL, certo? Nesse momento, quando você inserir o segundo elemento, ali naquele if no final da função, vai cair no else, certo?

Você faz:

p2 = lista;
while (p2->next != NULL)

Esse laço não vai ser executado nenhuma vez, porque o next do elemento da lista é NULL, e, portanto, nada será inserido na lista.

Realmente, não tinha percebido. Ja ajustei isso… Botei o p2->prox = p1; fora do while :wink:

Ainda tá dando o negócio do NULL? Não to conseguindo enxergar o problema. Se estivesse com meu computador aqui eu testava, mas to no celular kkkkkkk

Sim, ainda não resolveu o problema. ele nem chega a entrar no else, pois toda vez que ele entra na função insere, ele entra como se estivesse NULL

Se tu não encontrar o problema ou ninguém te responder até mais tarde, eu dou uma olhada quando chegar em casa.

Vlw cara, ja consegui resolver :wink: