• Martes 21 de Mayo de 2024, 02:37

Autor Tema:  Ayuda Sobre árboles  (Leído 854 veces)

Juan Manuel

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Ayuda Sobre árboles
« en: Domingo 8 de Febrero de 2004, 20:47 »
0
No se como ponerle a la raiz del arbol 'AAA', de este programa que etoy haciendo.
Acá está lo que hice hasta ahora:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define RAIZ AAA
#define MAX 100
/**************ESTRUCTURA DEL ARBOL ***************************************/
typedef struct _nodo
{
char palabra[20];
int repetidas;
int cod[MAX];
struct _nodo *dcho;
struct _nodo *izdo;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;
/**************************FUNCIONES******************************************/
/*un arbol esta vacio si su raiz es null*/
int Vacio(Arbol r) {
return r== NULL;
}


/********* funcion LLENADO del arbol*******************************/
void insertar (Arbol *a, char *parr)
{ /*padre null, nodo raiz*/
int cod[MAX];
int i= 0, f;
pNodo padre = NULL;
pNodo actual = *a;
while (!Vacio(actual) && parr != actual->palabra) /*Ejecuta hasta ubicar la palabra en el arbol */
{
padre = actual;
if (strcmp(actual->palabra, parr) > 0)
{
actual = actual->dcho;
cod = 1;
i++;
}
else
{
if (strcmp(actual->palabra, parr) < 0)
{
actual = actual->izdo;
cod = 0;
i++;
}
}
}
if(!Vacio(actual)) /*aca salio porque el nodo no esa vacio osea, la palabra es igual****/
{
(padre)->repetidas++;
}
if(Vacio(padre)) /*aca salio porque el nodo esta vacio,osea, metemos ahi la palabra*/
{
padre=(Arbol)malloc(sizeof(tipoNodo));

strcpy((padre)->palabra,parr);/*confirmar que funciona */
(padre)->izdo = (padre)->dcho = NULL;
while (cod[f++] != NULL)
{
padre->cod[f] = cod[f];
}
/*escribir la grabada de la palabra en el nodo que quedo**/
}
}



void llenar(Arbol1)
{
/*Abre el archivo de texto*/
FILE *pf = NULL;
char arr[16];
char *parr;

parr = arr;
pf = fopen("c:\\texto.txt", "r");
if (pf == NULL)
{
perror("No se encuentra el archivo\n");
exit(0);
}
while (pf != NULL) /*Ejecuta hasta llegar al final del archivo*/
{
fgets (arr,30, pf);
insertar (&Arbol1 , &parr);
}
}


void main()
{
Arbol Arbol1=NULL;
int i= 0;
Arbol1=(Arbol)malloc(sizeof(tipoNodo));
for (i=0; i < 3; i++)
{
(Arbol1)->palabra = 'A';
}
(Arbol1)->izdo = (Arbol1)->dcho = NULL;
llenar(&Arbol1);
printf("no funciona");
}

La consigna del programa es la siguiente:
Problema:
Se recibe un texto en el archivo Texto.txt, el cual se debe procesar para poder responder a las preguntas enunciadas más abajo, y además se debe encriptar mediante cadenas formadas por 0’s y 1’s., haciendo uso para ello de un árbol binario de búsqueda. El texto encriptado debe ser almacenado en el archivo Encriptado.txt, y las claves de codificación en el archivo Codificación.txt.

El texto a encriptar se debe leer desde el archivo, y cada palabra en el mismo debe buscarse (y en caso de no encontrarse ser agregada) en un árbol binario de búsqueda. (cada nodo del árbol puede contener, además de la palabra, otra información que sea de utilidad para resolver el problema).

La cadena de 0’s y 1’s que corresponderá a cada palabra en el archivo encriptado, viene determinada por el camino que se debe recorrer desde la raíz hasta el nodo que contiene dicha palabra: cada vez que bajamos a un hijo izquierdo ponemos un 0 en la cadena y cada vez que bajamos a un hijo derecho ponemos un 1. El nodo raíz contiene un valor especial “AAA”.

En el archivo Encriptado.txt, se almacenan las cadenas de ceros y unos, separadas por un espacio en blanco.

En el archivo Codificación.txt, se debe almacenar una línea para cada palabra codificada con el siguiente formato (las palabras repetidas deben guardarse en este archivo una única vez):
palabra palabra-encriptada

Estos dos archivos de salida, permitirían eventualmente reconstruir el texto original.


Ejemplo: mientras se procesa el texto en el archivo Texto.txt, al momento de tener leídas las primeras 5 palabras (esta lectura luego continúa hasta terminar el archivo), el árbol generado es el siguiente:

Tiempo: 1
de: 10
vida: 11
datos: 100
los: 101












El programa debe procesar el archivo Texto.txt, generar el árbol binario de búsqueda, generar el archivo Encriptado.txt y Codificacion.txt, y permitir dar respuestas a las opciones del siguiente menú:
1. Cuál es la palabra más repetida en el archivo de entrada.
2. Cuál es la palabra de mayor longitud en el archivo de entrada.
3. Cuál es la profundidad del árbol generado.
4. Cuál es longitud promedio de las cadenas generadas para codificar cada palabra.
5. Dada una letra (la cual debe ser ingresada luego de seleccionar esta opción), determinar cuantas palabras hay en el archivo de entrada que comiencen con dicha letra.
6. Dada una letra (la cual debe ser ingresada luego de seleccionar esta opción), determinar cuantas palabras hay en el archivo de entrada que terminen con dicha letra.
7. Liberar toda la memoria dinámica solicitada y salir del programa.

 Permitir que el usuario seleccione opciones, tantas veces como considere necesario. Para cada selección dar la respuesta y volver a mostrar el menú.
 Las opciones del menú, la selección de opciones, el ingreso de datos adicionales y las respuestas deben estar presentadas adecuadamente, teniendo en cuenta aspectos de interface con el usuario.

Observaciones:
- se debe decidir que información almacenar en cada nodo del árbol, para que las operaciones a realizar por el programa sean lo más eficientes posibles.

Decearía mucho que me puedan ayudar con este problema.

Saludos

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Ayuda Sobre árboles
« Respuesta #1 en: Domingo 8 de Febrero de 2004, 21:56 »
0
Para poner el valor "AAA" al primer nodo deberas incluir en el main, justo despues del malloc:

Código: Text
  1.  
  2. strcpy(Arbol1-&#62;palabra, &#34;AAA&#34;); // Copias la cadena en el campo palabra
  3.  
  4.  

Un momento, lo estoy mirando, y veo que para el campo palabra de la estrutura reservas siempre 20 caracteres, pero después cuando asignas AAA con el bucle no finalizas la cadena (debes poner '\0'). Eso puede darte problemas si despues trabajas con la cadena (usas strcmp y demás...). El uso del strcpy te finaliza la cadena de destino.

Supongo que el error te lo da pq no has finalizado la cadena.

¿Hay alguna duda más?

Nos vemos :hola:
Core Dumped
zirrus.es