Ir ao conteúdo
  • Cadastre-se

Problema- falha de segmentação lista dinamica


Luã Faria

Posts recomendados

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

Link para o comentário
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
}

 

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • mês depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...