LacosTTe Posted April 12, 2012 Report Share Posted April 12, 2012 (edited) 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 April 13, 2012 by LacosTTe Quote Link to comment Share on other sites More sharing options...
0 bruce845 Posted April 13, 2012 Report Share Posted April 13, 2012 (edited) 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 April 17, 2012 by bruce845 Quote Link to comment Share on other sites More sharing options...
Question
LacosTTe
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.
Edited by LacosTTeLink to comment
Share on other sites
1 answer to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.