Ir ao conteúdo
  • Cadastre-se
Luã Faria

Problema- falha de segmentação lista dinamica

Recommended Posts

Apos executar a função lerDados , que consegue encadear uma lista com nos que contem retas, quando tentar usar a função retas_verticais com um simples printf recebo falha na segmentação... se eu usar somente a imprime_lista funciona certinho..

#include<stdio.h>
#include<stdlib.h>
typedef struct{
	int x,y;
}ponto;
typedef struct a{
	ponto p1,p2;
	struct a *prox;
}no;

no *aloca_no(){//aloca espaço de memoria para conter um no
	no *a;
	if(!(a=(no*)malloc(sizeof(no))))
		exit(1);
	a->prox = NULL;
	return a;
}
void imprime_lista(no *imprime, char *nome){// imprime as retas contidas nos nós da lista
	no *aux = imprime;
	while(aux){
		printf("-----------------------%s-----------------------\n%d %d || %d %d\n", nome,aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y);
		aux = aux->prox;
	}
}
void incluir_no(no **lista, no*novo){// inclui um no na lista
	if(*lista == NULL){
		*lista = novo;
	}
	else{
		no *aux = *lista;
		while(aux->prox)
			aux = aux->prox;
		aux->prox = novo;
	}
}
void lerDados(no **dadosEntrada, char *local){// le os dados do arquivo em um no e chama a função incluir no para coloca-lo na lista
	FILE *arquivo;
	no *acc;
	if(!(arquivo = fopen(local,"r"))) 	
		exit(1);
	else{
		printf("Foi\n");
		while(!(feof(arquivo))){ 
			acc = aloca_no();
			fscanf(arquivo,"%d %d %d %d\n", &(acc->p1.x), &(acc->p1.y), &(acc->p2.x), &(acc->p2.y));
			incluir_no(dadosEntrada, acc);
		}
		fclose(arquivo);
	}
}
void retas_verticais(no *dadosEntrada, no *verticais){// não funciona, causa falha na segmentação
	printf("uéé");
}
void main(){
	no *dadosEntrada, *verticais, *horizontais, inclinadas;
	char local[50]="/home/lua/Workspace/Algoritmos2/dados.txt";	
	lerDados(&dadosEntrada, local);
	imprime_lista(dadosEntrada, "Dados Brutos");// imprime os dados da lista perfeitamente
	retas_verticais(dadosEntrada, verticais);// se eu apagar essa linha o programa funciona, se nao tenho falha na segmentação
}

 

 

 

ex2.c

dados.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luã Faria Ponteiro de ponteiro é muito chato... Bem, você tem alguns problemas ai, um bem fácil de notar é que a função "inclui_no", não está inserindo na primeira célula.

Outra coisa que observei foi que seu arquivo.txt não funciona com a minha modificação do seu fonte, talvez pela codificação, tente criar um arquivo com o notepad++ ou use esse: dados111.txt

 

Já o código, fiz apenas algumas modificações e testes, mas não tenho muito conselho pra te dar, talvez esse código te ajude a enxergar onde você está errando.
 

#include<stdio.h>
#include<stdlib.h>
typedef struct {
   int x, y;
} ponto;

typedef struct a {
   ponto p1, p2;
   struct a *prox;
} no;

no *aloca_no() { //aloca espaço de memoria para conter um no
   no *a;
   if ( !( a = ( no* )malloc( sizeof( no ) ) ) )
      exit( 1 );
   a->prox = NULL;
   return a;
}

void imprime_lista( no *imprime, char *nome ) { // imprime as retas contidas nos nós da lista
   printf( "\n ------------------INICIO--- IMPRIME_LISTA ----------------------------\n" );
   no *aux = &imprime;
   int i;

   for ( i = 0; aux; i++) {
      //não imprime a primeira célula
      //if (i != 0)
      printf( "-----------------------%s-----------------------\n%d %d || %d %d\n", nome, aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );

      aux = aux->prox;
   }
   printf( "\n-------------------FIM-- IMPRIME_LISTA ----------------------------\n" );
}

void incluir_no( no **lista, no *novo ) { // inclui um no na lista
   printf( "\n -----------------------INICIO--INCLUIR_NO-------------------------\n" );
   if ( lista == NULL ) {
      lista = novo ;
      printf("\nIncluiu o primeiro no");
   }
   else {
      no *aux = lista;
      while ( aux->prox ) {
         aux = aux->prox;

         printf( "\nPassou por: %d %d %d %d\n", aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );
         getchar();
      }

      aux->prox = novo;
      printf( "\nIncluiu: %d %d %d %d\n", aux->p1.x, aux->p1.y, aux->p2.x, aux->p2.y );
   }
   printf( "\n-----------------------FIM--INCLUIR_NO-------------------------\n" );
}

void lerDados( no **dadosEntrada, char *local ) { // le os dados do arquivo em um no e chama a função incluir no para coloca-lo na lista
   FILE *arquivo;
   no *acc;
   int contador = 0;
   printf( "\n-----------------------INICIO--Ler_DADOS-------------------------\n" );

   if ( !( arquivo = fopen( local, "r" ) ) )
      exit( 1 );
   else {
      while ( !( feof( arquivo ) ) ) {
           printf( "\n-----------------------LOOP--INCIAL--Ler_DADOS-------------------------\n" );
         acc = aloca_no();
         fscanf( arquivo, "%d %d %d %d\n", &( acc->p1.x ), &( acc->p1.y ), &( acc->p2.x ), &( acc->p2.y ) );



         //para observações
         printf( "\nLeitura %d: ", contador + 1 );
         printf( "%d %d %d %d\n", acc->p1.x, acc->p1.y, acc->p2.x, acc->p2.y );
         contador ++;
         printf( "\n-----------------------LOOP--FINAL--Ler_DADOS-------------------------\n" );


         incluir_no( &dadosEntrada, acc );

      }
      fclose( arquivo );
   }
      printf( "\n-----------------------FIM--Ler_DADOS-------------------------\n" );
}
void retas_verticais( no *dadosEntrada, no *verticais ) { // não funciona, causa falha na segmentação
   printf( "uéé" );
}

void main() {
   no *dadosEntrada, *verticais, *horizontais, inclinadas;
   char local[50] = "dados111.txt";

   lerDados( &dadosEntrada, local );
   imprime_lista( dadosEntrada, "Dados Brutos" ); // imprime os dados da lista perfeitamente
   retas_verticais( dadosEntrada, verticais ); // se eu apagar essa linha o programa funciona, se nao tenho falha na segmentação
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include<stdio.h>
#include<stdlib.h>

typedef struct _ponto{
	int x,y;
}Ponto;

typedef struct _node {
   Ponto p1, p2;
   struct _node *proximo;
} Node;

typedef struct _dados {
   Ponto p1, p2;
} Dados;

typedef Node *pNode;
typedef Node *Lista;

void Introduzir  ( Lista*, Dados );
int  ListaVazia  ( Lista   ); //Comprova si a lista está vazia, retorna true...(lista==NULL)
void MostrarLista( Lista   );
void BorrarLista ( Lista*  );
Lista LoadList   ();

int main() {
    Lista lista = NULL;
    
    lista = LoadList();
    
    if( lista == NULL ){
        printf("Nao foi carregado nenhuma lista desde o arquivo");
    }
    
    Introduzir ( &lista, (Dados){{10, 20}, {30, 40}} );
    Introduzir ( &lista, (Dados){{50, 60}, {70, 80}} );
    
    MostrarLista ( lista );

    BorrarLista ( &lista );
    
    system ( "PAUSE" );
    return 0;
}

void Introduzir ( Lista *lista, Dados d ) {
    pNode novo, anterior;
    
    //Alocamos un novo nodo dinamicamente
    novo = ( pNode ) malloc ( sizeof ( Node ) );
    //atribuimos os dados ao novo nodo criado, abaixo linkaremos ele na lista
    novo->p1.x = d.p1.x;
    novo->p1.y = d.p1.y;
    novo->p2.x = d.p2.x;
    novo->p2.y = d.p2.y;
    
    /*Se a lista está vazia primeiro devemos criar uma lista >_<, si nao pasamos a else*/
    if ( ListaVazia ( *lista ) ) {
        /* Equivalente a novo->proximo = NULL... porque não ha proximo, novo é o ultimo por enquanto e deve apontar a NULO*/
        novo->proximo = *lista;
        /*Agora a lista aponta ao novo nó, e esse novo nó aponta a NULL, pois como ja falei ele é o ultimo... por enquanto*/
        *lista = novo;
    
    } else { // Sempre que a lista NÃO estiver vazia vai cair aqui, e avançaremos até encontrar o ultimo nó para inserir o nodo a continuaçao.

        /* Avançamos até saber qual é o ultimo elemento da lista, sempre anotando qual é, e fazemos isso desde o inicio da lista*/
        anterior = *lista;
        while ( anterior->proximo ){
            anterior = anterior->proximo;
        }
        
        /* Uma vez encontrado o ultimo elemento da lista procedemos a Inserir o novo nó depois do ultimo nó anotado anteriormente*/
        novo->proximo = anterior->proximo; //O novo nó aponta a NULL, pois o anterior nó apontava a NULL e agora o novo será o ultimo, a efeitos é o mesmo que novo->proximo = NULL
        anterior->proximo = novo; //O anterior aponta ao novo, e o novo é o ultimo nó da lista, por isso aponta a NULL, porque ja não tem mais nenhum nó que apontar por enquanto
    }
}

int ListaVazia ( Lista lista ) {
    return ( lista == NULL );
}

void BorrarLista ( Lista *lista ) {
    pNode node;
    
    while ( *lista ) {
        node = *lista;
        *lista = node->proximo;
        free ( node );
    }
}

void MostrarLista ( Lista lista ) {
    pNode node = lista;
    
    if ( ListaVazia ( lista ) ) printf ( "A lista vazia\n" );
    else {
        while ( node ) {
            printf ( "(%d,", node->p1.x );
            printf ( "%d,", node->p1.y );
            printf ( "%d,", node->p2.x );
            printf ( "%d)\n", node->p2.y );
            node = node->proximo;
        }
        
        printf ( "\n" );
    }
}

//Carrega a lista desde o arquivo dados.txt, eu coloquei ele na mesma pasta
Lista LoadList(){
    Lista lista = NULL;
    Dados d;
    FILE* arquivo;
    
    if( (arquivo = fopen("dados.txt", "r" )) == NULL ){
        perror("Erro: ");
    }else{
        while ( fscanf(arquivo, "%d %d %d %d%*c", &d.p1.x, &d.p1.y, &d.p2.x, &d.p2.y ) != EOF ){
            Introduzir(&lista, d);
        }
    }
    return lista;
}

Para sair o código com cor escolha o ícone chamado Code, ele tem essa aparência-> <>, logo selecione na esquina inferior direita o linguagem C... ou também javascript se entende bem.
Fiz um código desde zero, está bem comentado nas partes mais criticas, si tiver duvida pergunte. Ponha o arquivo de dados na mesma pasta, seja feliz >_<.

  • Curtir 1

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





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

×