Ir para conteúdo
Fórum Script Brasil
  • 0

Ponteiros, Lista encadeada


LacosTTe

Pergunta

ola estou com uma dúvida...crieo que seja algo simples. O programa ta dando erro quando entra no while do insere pelo que percebi.

A idéia é simples...uma lista encadeada que insere os elementos sempre no fim.

O erro aqui no codeblocks(ubuntu) é segmentation defautl. já procurei algo a respeito, mas não adiantou.

eis a tentativa de código.

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

struct Ponto{
    int x;
    int y;
    struct Ponto* prox;
    };
typedef struct Ponto p;

p* inicializa(){
      return NULL;
}

p* insere(p* lista, int x, int y){

    p* novo = (p*)malloc(sizeof(p));

    novo->x = x;
    novo->y = y;


        while(lista->prox != NULL)
             lista = lista->prox;

    lista = novo;
    novo->prox = NULL;
   
    return novo;
}

void mostrarlista(p* lista){

    p* p;
    int i  = 0;

    for (p = lista; p != NULL; p=p->prox)
    {
        ++i;
        printf("\n\nPonto %d: x [ %d ] = %d \n y [ %d ] = %d",i,i,p->x,i,p->y);
    }
}

int main (){

    p* lista;

    //lista = inicializa();
    lista = NULL;

    lista = insere(lista,1,2);
    lista = insere(lista,3,4);

    mostrarlista(lista);

    system("pause");

    free(lista);
    return 0;
}

Editado por LacosTTe
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Amigo, é o seguinte:

Não sei se você sabe ponteiro de ponteiro, mas eu usei em seu programa para caso a lista esteja vazia, a sua função adicionar o elemento que irá estar na cabeça.

É o seguinte, você estava tentando percorrer uma lista que estava apontando para NULL e a função insere sempre retornava o ponteiro do novo elemento, mas com o retorno da função você estava atribuindo na variável que tinha que guardar a cabeça da lista.

Aí a variável lista guardava o ponteiro do elemento que você acabava de inserir, perdendo o resto da lista.

Eu remodelei o su programa e ao invés de usar o nome definido por você no typedef, eu usei o nome da struct mesmo, mas isso não interfere em nada.

Eis as minhas correções:


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

struct Ponto
{
int x;
int y;
struct Ponto *prox;
};

void insere(struct Ponto **lista, int x, int y)
{
struct Ponto *novo = (struct Ponto *)malloc(sizeof(struct Ponto));
struct Ponto *temporario = *lista; // Nunca mexa no ponteiro que aponta para a cabeça da lista!

novo->x = x;
novo->y = y;
novo->prox = NULL; // O prox da célula que você acabou de criar têm que apontar para NULL.

if(*lista==NULL) // Se não houver lista, a célula recém-criada deve encabeçar a lista.
{
*lista = novo;
}
else
{
while(temporario->prox!=NULL) //Use um ponteiro temporário para percorrer a lista.
temporario = temporario->prox;
temporario->prox = novo; // Aí o prox da última célula da lista têm que apontar para a célula recém-criada!
}
return; // A função não necessita de retorno.
}

void mostrarlista(struct Ponto *lista)
{
struct Ponto *p;
int i = 0;

for (p = lista; p != NULL; p=p->prox)
{
++i;
printf("\n\nPonto %d: x [ %d ] = %d \n y [ %d ] = %d",i,i,p->x,i,p->y);
}
}

int main(int argc,char **argv)
{

struct Ponto *lista;

lista = NULL;

insere(&lista,1,2);
insere(&lista,3,4);

mostrarlista(lista);

system("pause");

free(lista);
return 0;
}
[/codebox]

Espero ter ajudado!

Editado por bruce845
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...