Inicio > C y C++ > rolan2kn > arboles binarios

arboles binarios

Experto:
Usuario: Anónimo Fecha: 25/06/2009
Valoración: (5,00 sobre 5) Categoría: C y C++
19/06/2009
Usuario
hola amigo experto cordial saludo me gustaria saber si me puedes ayudar...con el
siguiente problemilla...
bueno debo cargar un archivo de texto .txt en c++ al cual debo contabilizar
el total de las palabras diferentes  de este archivo  ,ademas mostrar inorden las primeras 20 palabras.....
y bueno aca sta tengo como abrir el archivo txt...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main() {
FILE *archivo;
char caracter;
archivo = fopen("c:\prueba.txt","r");
if (archivo == NULL)
{
printf("\nEl archivo no existe \n\n");
getch();
exit(1);
}
else
{
printf("\nEl contenido del archivo de prueba es \n\n");
while (feof(archivo) == 0){
caracter = fgetc(archivo);
printf("%c",caracter);
//getch();
}
}
--------------------------------------------
para contar  las palabras diferentes creo seria asi...
**Sumar uno al contador cada vez que antes de una letra alla algún separador de palabras
-----------------------------------------------
y para mostrar inorden las primeras 20 palabras seria asi...
cant=20; //sria la cantidad de palabras q queres mandar (va en el main)
inorden (eaiz,cant);
//////////////////////////////////////////////////////////////
void inorden (struct nodo *r, int cant) //r: raiz
{
inorden (r->izq);
if(cant<0) exit(0);
printf("%s", r->palabra);
cant=cant-1;
inorden(r->der);
}
bueno amigo experto espero me puedas ayudar ......de como empezar el arbol binario
ya teniendo estos datos... ..
graciias por tu atencionnnn.....
22/06/2009
wasm30, experto respondiendo en C y C++
Experto
bueno te dire que segun lo que entiendo no necesitas otra cosa que hacer el insertar del arbol binario y otro metodo que te reconozca las palabras y las vaya insertando en el arbol, el insertar deberia ser algo como esto:
void insertar(struct Nodo* r, string nuevapalabra)
{
    if(!r) return;
    if(nuevapalabra < palabra)
   {
       if(hizq)
          insertar(hizq, nuevapalabra);
       else
          hizq = new Nodo(palabra); // suponiendo que tengas un constructor que reciba la palabra y ponga los hijos del arbol en cero.
}
   else if(nuevapalabra > palabra)
   {
       if(hder)
          insertar(hder, nuevapalabra);
       else
          hder = new Nodo(palabra); // suponiendo que tengas un constructor que reciba la palabra y ponga los hijos del arbol en cero.
}
}
y luego que hagas el metodo que te devuelva las palabras y las metas en el arbol mediante el insertar, ya las vas a tener a tu disposicion, con el inorden te las debe imprimir en le orden que quieras. Para saber la cantidad de palabras diferentes basta con saber la cantidad de elementos del arbol, eso lo puedes hacer mediante el inorden tambien.
 
Saludos.
22/06/2009
Usuario
hola amigo gracias por el gran interes en tu respuesta...
bueno despues de unos largos intentos hemos logrado llevar el programa hasta donde
nos cuenta el total de las palabras diferentes  sin embargo ,,,,hemos encontrado gran dificutad en el inorden de las  de las primeras 20 palabras...
agrego el codigo el cual hemos realizado ,como tambien el archivo con el cual estamos
trabajando ...
aqui puedes descargar el archivo...
http://cid-96ee94613cf36780.skydrive.live.com/self.aspx/sOfwArE%202008-10-15/prueba.txt
aqui sta el codigo que hemos realizadoooooo...gracias a vuestra ayuda...y dale
en verdad me gustaria saber si me puedes ayudar a culminar el programa teniendo como
base mi codigo ...graciias por tu atencion.....
#include <alloc.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct nodo
 {
  struct nodo *izq, *der;
  char *dato;
 };
int cont=0;
struct nodo *crear(char s[30])
 {
  struct nodo *p;
  p=(struct nodo *) malloc (sizeof(struct nodo));
  p->izq=NULL;
  p->der=NULL;
  p->dato=s;
  return (p);
 }
void insertar(struct nodo *raiz, char s[30])
{
  struct nodo *nuevo,*q,*p;
  nuevo=crear(s);
  q=NULL;
  p=raiz;
  while(p!=NULL && strcmp( p->dato,nuevo->dato)!=0)
   {
     q=p;
     if(strcmp(p->dato,nuevo->dato)<0)
      p=p->izq;
     else
     // if (strcmp(p->dato,nuevo->dato)<0)
       p=p->der;
  }
 if(strcmp(p->dato,nuevo->dato)!=0)
  if(strcmp(q->dato,nuevo->dato)>0)
   q->izq=nuevo;
  else
   q->der=nuevo;
}
cargar()
 {
   struct nodo *raiz=NULL;
   FILE *archivo;
   char caracter[30],espa, tem[30];
   int b=0;
   archivo = fopen("c:\prueba.txt","r");
   if (archivo == NULL)
   {
      printf("\nEl archivo no existe \n\n");
      getch();
      exit(1);
   }
   else
   {
     printf("\nEl contenido del archivo de prueba es \n\n");
     while (feof(archivo) == 0)
     {
      espa=getc(archivo);
     if (espa==' ')
      {
       printf("\n");
           cont++;
      }
         else
      {
       printf("%c",espa);
      }
     b++;
       //  getch();
        
             //llenar arbol binario
        /*if (raiz==NULL)
         {
              raiz=crear(caracter);
         }
        else
         {
              insertar(raiz,caracter);
         }*/
           // printf("%c",caracter);
 
     }
     printf("\nEL NUMERO DE PALABRAS ES: %d",cont);
   }
   getch();
   return 0;
 }
 void main()
{
 //struct nodo *raiz=NULL;
 char opc;
 int dato,x,s;
 do
  {
   clrscr();
   gotoxy(27,8);printf("1. Cargar Archivos");
   gotoxy(27,10);printf("2. Contar palabras");
   gotoxy(27,12);printf("3. Mostrar palabras");
   gotoxy(27,20);printf("4. Salir");
   gotoxy(27,22);printf("opcion: []\b\b");
   opc=getche();
   switch(opc)
   {
     case '1':
        clrscr();
        cargar();
     break;
    case '2':
     clrscr();
   printf("EL NUMERO DE PALABRAS ES: %d",cont);
     getch();
    break;
    case '3':
     clrscr();
    // orden(raiz);
     getch();
    break;
    case '4': break;
    default:
      clrscr();
      gotoxy(31,10);printf("La opcion no existe");
      gotoxy(24,12);printf("presione una tecla para continuar...");
      getch();
    break;
    
   }
  }while(opc!='4');
}
25/06/2009
wasm30, experto respondiendo en C y C++
Experto
bueno mira para el inorden para las 20 palabras, tienes que tener una referencia que se vaya modificando a medida que bajas un nivel en el arbol, y cuando llegue a 20 terminas. Es algo como lo siguiente:
void mostrar20(struct nodo *raiz)
{
    int cant = 0;
    inorden(raiz, cant);
}
void inorden(struct nodo *raiz, int& cant)
{
    if(!raiz || cant == 20)
       return;
    printf("palabra %d: %s", ++cant, raiz->dato);
   if(raiz->hIzq)
     inorden(raiz->hIzq, cant);
   if(raiz->hDer)
     inorden(raiz->hDer, cant);
}
el que tienes que llamar en el main es mostrar20.
Saludos.
25/06/2009
Usuario
hola amigo graciias de verdad que me fue de gran ayuda...
y fue una fantastica solucion....
Más opciones
Enlaces patrocinados