Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Luks_88

Ponteiros

Recommended Posts

Preciso construir um TAD (Tipo Abstrato de Dados) com ponteiros e tudo, mas eu não estou conseguindo nem o basicão. Preciso criar uma lista, mas eu não estou conseguindo nem inicializar a lista vazia, nem adicionar células, nem nada, dá "segmentation fault"... Vejam se dá pra ajudar...Já procurei, mas não acho o que está errado...Muito obrigado


#include <stdio.h>
#include <stdlib.h>

struct cel {
int conteudo;
struct cel *prox;
};

typedef struct cel celula;

void inicializa (celula *ini)
{
ini = malloc (sizeof (celula));
ini->prox = NULL;
}

void *mallocX (unsigned int nbytes)
{
void *ptr;
ptr = malloc (nbytes);
if (ptr == NULL) {
printf ("Socorro! malloc devolveu NULL!\n");
exit (EXIT_FAILURE);
}
return ptr;
}

void insere (int x, celula *p)
{
celula *nova;
nova = malloc (sizeof (celula));
nova->conteudo = x;
nova->prox = p->prox;
p->prox = nova;
}

main()
{
celula *a;
int x;
scanf("%d",&x);
inicializa (a);
insere (x,a);
system("pause");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Luks_88

Eu encontrei algumas coisas estranhas no código, quem sabe altera-las nao fazem o código funcionar...


struct cel {
int conteudo;
struct cel *prox;
};

typedef struct cel celula;

voce pode trocar o trecho acima por isso:

typedef struct cel{
int conteudo;
cel* prox;
}celula;
// Isso cria uma estrutura com o nome "celula", e o "prox" também como "celula"

void inicializa (celula *ini)
{
ini = malloc (sizeof (celula));
ini->prox = NULL;
}

Talvez fosse mais interessante criar uma estrutura do tipo lista, com uma celula para marcar a cabeça, ou inicio da lista... Dai você inicializa a cabeça ou inicio da lista...

void *mallocX (unsigned int nbytes) 
{
void *ptr;
ptr = malloc (nbytes);
if (ptr == NULL) {
printf ("Socorro! malloc devolveu NULL!\n");
exit (EXIT_FAILURE);
}
[B]return ptr;[/B]
}

Essa função é do tipo void, então nao pode retornar nada. Outra coisa, se fosse uma função de outro tipo, o valor a ser retornado sempre deve estar entre parenteses (E.g. return(ptr)).

void insere (int x, celula *p)
{
celula *nova;
[B]nova = malloc (sizeof (celula));[/B]
nova->conteudo = x;
nova->prox = p->prox;
p->prox = nova;
}

A parte em negrito deve ser alterada para "nova = (celula*)malloc(sizeof(celula));"

Bom, acho que é isso... altere estas coisas, e veja se o código compila... Se compilar, veja se faz o que deveria... :P

Abraços,

Thiago.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segui as dicas, valeu deu certinho... Fiz mais umas adaptações, além das que você passou e está compilando perfeitamente e funcionando... muito obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×