Ir ao conteúdo

Posts recomendados

Postado

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;
  }
}

 

Postado

 

#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;
  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\n", tmp->num);
    tmp = tmp->prox;
  }
}

O que estava acontecendo é que você estava modificando uma "cópia" do ponteiro LISTA da main.

Citação

LISTA = p1;

Por ser uma cópia o ponteiro da main vai continuar sendo NULL.

Para resolver isso basta passar o endereço do próprio ponteiro para que toda ação feita na função Insere seja feito diretamente no endereço do ponteiro LISTA.

 

adicionado 2 minutos depois

Isso também não pode ficar dentro do while

Citação

p2->prox = p1;

Se não vai perder dados

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!