Error en codigo de arboles (segmentation fault)
Publicado por Dark-ArTaX (9 intervenciones) el 11/07/2006 04:18:36
Necesito ayuda en este codigo cuando le doy la ruta del archivo que va a leer me dice segmentation fault porque me dice esto? que puedo hacer para resolver el problema? les agradezco toda su ayuda
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
/****************************************************Estructura del arbol**************************************************/
typedef struct info{
char palabra[20];
int veces;
}info;
typedef struct hoja{
info data;
struct hoja *hijo_d;
struct hoja *hijo_i;
}arbol;
/******************************************Funciones para manejo de Arboles************************************************/
arbol *nueva_hoja(info data)
{
arbol *aux = malloc (sizeof(arbol));
aux->data = data;
aux->hijo_d = NULL;
aux->hijo_i = NULL;
return(aux);
}
arbol *agregar (arbol *raiz, info data){
if (raiz == NULL)
{
raiz = nueva_hoja(data);
return (raiz);
}
else
if ((strcmp(raiz->data.palabra,data.palabra)) == 0)
{
raiz->data.veces = raiz->data.veces + data.veces;
return(raiz);
}
else
if ((strcmp(raiz->data.palabra,data.palabra))>0)
return (agregar(raiz->hijo_i,data));
else
if ((strcmp(raiz->data.palabra,data.palabra))<0)
return (agregar(raiz->hijo_d,data));
}
arbol *buscar(arbol *raiz, char busca[])
{
if (!raiz) return(NULL);
else
if ((strcmp(raiz->data.palabra,busca)) == 0)
return(raiz);
else
if ((strcmp(raiz->data.palabra,busca)) > 0)
return(buscar(raiz->hijo_i,busca));
else
if ((strcmp(raiz->data.palabra,busca)) < 0)
return(buscar(raiz->hijo_d,busca));
}
void freetree(arbol *raiz)
{
if (raiz != NULL)
{
freetree(raiz->hijo_i);
freetree(raiz->hijo_d);
free(raiz);
}
}
void delete_word(arbol **raiz, char deleting[])
{
if(!(*raiz))
printf("La palabra %s no se encuentra\n",deleting);
else
if((strcmp((*raiz)->data.palabra,deleting))<0)
delete_word(&(*raiz)->hijo_i, deleting);
else
if((strcmp((*raiz)->data.palabra,deleting))<0)
delete_word(&(*raiz)->hijo_i, deleting);
else
{
arbol *aux=(*raiz);
if (aux->hijo_i == NULL) (*raiz) = aux->hijo_d;
else if (aux->hijo_d == NULL) (*raiz) = aux->hijo_i;
else
{
arbol *aux2, *aux3;
aux3 = aux;
aux2 = aux->hijo_i;
while (aux2->hijo_d)
{
aux3 = aux2;
aux2 = aux2->hijo_d;
}
aux3->data = aux2->data;
if (aux3 == aux)
aux3->hijo_i = aux2->hijo_i;
else aux3->hijo_d = aux2->hijo_d;
aux = aux2;
}
free(aux);
}
}
/**************************************************************************************************************************/
arbol *leer(arbol *raiz, char ruta[])
{
char lectura[256];
char *cargar;
info data;
FILE *prueba = NULL;
int i=0, cont=0;
prueba = fopen(prueba, "rt");
while (!feof(prueba))
{
fgets(lectura,256,prueba);
while (lectura[i] != '\r')
{
if (lectura[i]!= ' ')
{
if (lectura[i] >= 'a' && lectura[i] <= 'Z')
strcat(cargar,lectura[i]);
cont = cont + 1;
}
else
if (lectura[i] == ' ' && cont >=2)
{
strcpy(data.palabra,cargar);
data.veces = 1;
raiz = agregar(raiz,data);
cont = 0;
strcpy(cargar,' ');
}
}
}
return(raiz);
}
void imprime(arbol *raiz)
{
if(raiz)
{
imprime(raiz->hijo_i);
printf("Palabra: %s \n",raiz->data.palabra);
printf("Veces repetidas: %d \n",raiz->data.veces);
imprime(raiz->hijo_d);
}
}
/***********************************Programa Principal************************/
int main(){
FILE *prueba = NULL;
char cadena[256];
char ruta[12];
arbol *raiz = NULL;
printf("Ruta del archivo: ");
scanf("%s",&ruta);
printf("%s",ruta);
prueba = fopen(ruta, "rt");
if (prueba == NULL)
printf("Archivo no se encuentra");
else
{
printf("Archivo abierto");
raiz = leer(raiz, ruta);
imprime(raiz);
}
fclose(prueba);
return 0;
}
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
/****************************************************Estructura del arbol**************************************************/
typedef struct info{
char palabra[20];
int veces;
}info;
typedef struct hoja{
info data;
struct hoja *hijo_d;
struct hoja *hijo_i;
}arbol;
/******************************************Funciones para manejo de Arboles************************************************/
arbol *nueva_hoja(info data)
{
arbol *aux = malloc (sizeof(arbol));
aux->data = data;
aux->hijo_d = NULL;
aux->hijo_i = NULL;
return(aux);
}
arbol *agregar (arbol *raiz, info data){
if (raiz == NULL)
{
raiz = nueva_hoja(data);
return (raiz);
}
else
if ((strcmp(raiz->data.palabra,data.palabra)) == 0)
{
raiz->data.veces = raiz->data.veces + data.veces;
return(raiz);
}
else
if ((strcmp(raiz->data.palabra,data.palabra))>0)
return (agregar(raiz->hijo_i,data));
else
if ((strcmp(raiz->data.palabra,data.palabra))<0)
return (agregar(raiz->hijo_d,data));
}
arbol *buscar(arbol *raiz, char busca[])
{
if (!raiz) return(NULL);
else
if ((strcmp(raiz->data.palabra,busca)) == 0)
return(raiz);
else
if ((strcmp(raiz->data.palabra,busca)) > 0)
return(buscar(raiz->hijo_i,busca));
else
if ((strcmp(raiz->data.palabra,busca)) < 0)
return(buscar(raiz->hijo_d,busca));
}
void freetree(arbol *raiz)
{
if (raiz != NULL)
{
freetree(raiz->hijo_i);
freetree(raiz->hijo_d);
free(raiz);
}
}
void delete_word(arbol **raiz, char deleting[])
{
if(!(*raiz))
printf("La palabra %s no se encuentra\n",deleting);
else
if((strcmp((*raiz)->data.palabra,deleting))<0)
delete_word(&(*raiz)->hijo_i, deleting);
else
if((strcmp((*raiz)->data.palabra,deleting))<0)
delete_word(&(*raiz)->hijo_i, deleting);
else
{
arbol *aux=(*raiz);
if (aux->hijo_i == NULL) (*raiz) = aux->hijo_d;
else if (aux->hijo_d == NULL) (*raiz) = aux->hijo_i;
else
{
arbol *aux2, *aux3;
aux3 = aux;
aux2 = aux->hijo_i;
while (aux2->hijo_d)
{
aux3 = aux2;
aux2 = aux2->hijo_d;
}
aux3->data = aux2->data;
if (aux3 == aux)
aux3->hijo_i = aux2->hijo_i;
else aux3->hijo_d = aux2->hijo_d;
aux = aux2;
}
free(aux);
}
}
/**************************************************************************************************************************/
arbol *leer(arbol *raiz, char ruta[])
{
char lectura[256];
char *cargar;
info data;
FILE *prueba = NULL;
int i=0, cont=0;
prueba = fopen(prueba, "rt");
while (!feof(prueba))
{
fgets(lectura,256,prueba);
while (lectura[i] != '\r')
{
if (lectura[i]!= ' ')
{
if (lectura[i] >= 'a' && lectura[i] <= 'Z')
strcat(cargar,lectura[i]);
cont = cont + 1;
}
else
if (lectura[i] == ' ' && cont >=2)
{
strcpy(data.palabra,cargar);
data.veces = 1;
raiz = agregar(raiz,data);
cont = 0;
strcpy(cargar,' ');
}
}
}
return(raiz);
}
void imprime(arbol *raiz)
{
if(raiz)
{
imprime(raiz->hijo_i);
printf("Palabra: %s \n",raiz->data.palabra);
printf("Veces repetidas: %d \n",raiz->data.veces);
imprime(raiz->hijo_d);
}
}
/***********************************Programa Principal************************/
int main(){
FILE *prueba = NULL;
char cadena[256];
char ruta[12];
arbol *raiz = NULL;
printf("Ruta del archivo: ");
scanf("%s",&ruta);
printf("%s",ruta);
prueba = fopen(ruta, "rt");
if (prueba == NULL)
printf("Archivo no se encuentra");
else
{
printf("Archivo abierto");
raiz = leer(raiz, ruta);
imprime(raiz);
}
fclose(prueba);
return 0;
}
Valora esta pregunta


0