Jump to content
Fórum Script Brasil
  • 0

Ponteiros, Lista encadeada


LacosTTe

Question

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

Edited by LacosTTe
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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!

Edited by bruce845
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...