LacosTTe Postado Abril 12, 2012 Denunciar Share Postado Abril 12, 2012 (editado) 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 Abril 13, 2012 por LacosTTe Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 bruce845 Postado Abril 13, 2012 Denunciar Share Postado Abril 13, 2012 (editado) 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 Abril 17, 2012 por bruce845 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
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.
Editado por LacosTTeLink para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
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.