Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/11/2010, 08:01
bofogdl
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 7 meses
Puntos: 0
ayuda con mi examenn estrcuutuas de datos

Necesito esta funcion, Desarrolle una función llamada CaminoNodo que en pida un valor entero al usuario e imprima el camino que se toma para llegar de la raiz a dicho nodo, imprimiendo el nombre en cada uno de los nodos anteriores. A su vez, dicha funciòn deberá regresar la suma de los salarios de todos los nodos que integran el camino.

Eso viene en el .txt

100
Alejandro Piza
100
50
Bofo Bautista
150
200
Pavel Pardo
100
1
Teresa de Calcuta
500
500
George Clooney
200
8
Rafael Marquez
300
82
Vicente Fox
50
77


El codigo:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Nodo{
    int clave;
    char nombre[100];
    int sueldo;
    struct Nodo *izquierdo,*derecho;
};

typedef struct Nodo NodoArbol;

NodoArbol* InsertarNodo(NodoArbol*,int,char[],int);
void EnOrden(NodoArbol*);
void BuscarNodo(NodoArbol*,int);
void EliminarNodo(NodoArbol**, int);
void Reemplazar(NodoArbol**, NodoArbol**);
int CaminoNodo(NodoArbol*,int);

int main(void)
{
	int menu, clave = 0, x = 0, sueldo = 0;
	char nombre[100];
	NodoArbol *Raiz;
	FILE *miArchivo;
	
	Raiz = NULL; 
	
	while(true)
	{
        printf("1.Insertar Empleado\n2.En Orden\n3.Buscar Empleado\n4.Despedir Empleado\n5.Funcion Examen\n6.Salir\nOpcion: ");
        scanf("%d",&menu);     
        
        switch(menu)
        {
            case 1:
                miArchivo = fopen("BDarbol.txt", "r");
				
                if(miArchivo == NULL)
				{
					printf("No se pudo encontrar el archivo");
					system("PAUSE");
					exit(0); 
                }
                
                while(!feof(miArchivo))
                {
                    fscanf(miArchivo, "%i\n", &clave);
					
                    fgets(nombre, 100, miArchivo);
                    x = strlen(nombre);
                    nombre[x-1] = '\0';
                    
                    fscanf(miArchivo, "%i\n", &sueldo);
                    
                    Raiz = InsertarNodo(Raiz,clave,nombre,sueldo);
                }   
                
                fclose(miArchivo); 
                
                printf("Se introdujo con exito a los empleados en el arbol\n\n");
                break;
                
            case 2:
                EnOrden(Raiz);
                break;
				
            case 3:
                printf("Introduzca la clave del empleado que desea consultar: ");
                scanf("%d",&clave);
                BuscarNodo(Raiz,clave);
                break;
                
            case 4:
                printf("Introduzca la clave del empleado que desea despedir: ");
                scanf("%d",&clave);
                EliminarNodo(&Raiz,clave);
                break;
                
            case 5:
				printf("Introduce la clave del Empleado para Funcion Examen:  ");
				scanf("%d",&clave);
				
				printf("El camino y el Salario son:\n",CaminoNodo(Raiz,clave));
                
                break;
			case 6:
				exit(0);
				break;
        }
	} 
}

NodoArbol* InsertarNodo(NodoArbol *Raiz, int clave, char *nombre, int sueldo)
{     
	if(Raiz == NULL)
	{
		Raiz = new NodoArbol;
		Raiz->izquierdo = Raiz->derecho = NULL;
		
		Raiz->clave = clave;
		strcpy(Raiz->nombre, nombre);
		Raiz->sueldo = sueldo;
	}
	
	else if(clave < Raiz->clave)
		Raiz->izquierdo = InsertarNodo(Raiz->izquierdo, clave, nombre, sueldo);
	
	else
		Raiz->derecho = InsertarNodo(Raiz->derecho, clave, nombre, sueldo);
	
	return(Raiz);
}

void EnOrden(NodoArbol *Raiz)
{
    if(Raiz != NULL)
    {
        EnOrden(Raiz->izquierdo);
        printf("\t%d\t%d\t%s\n",Raiz->clave, Raiz->sueldo, Raiz->nombre);
        EnOrden(Raiz->derecho);
    }    
}

void BuscarNodo(NodoArbol *Raiz, int valor)
{
	if(Raiz->clave == valor)
		printf("\t%d\t%d\t%s\n",Raiz->clave, Raiz->sueldo, Raiz->nombre); 
    
	if(valor > Raiz->clave) 
	{
		if(Raiz->derecho == NULL)
			printf("No lo encontre D:\n\n");
		else
			BuscarNodo(Raiz->derecho,valor);
	}
	
	if(valor < Raiz->clave)
	{
		if(Raiz->izquierdo == NULL)
			printf("No lo encontre D:\n\n");
		else    
			BuscarNodo(Raiz->izquierdo,valor); 
	}
}

void EliminarNodo(NodoArbol **Arbol, int valor)
{
    NodoArbol *Aux;
    
    if (*Arbol == NULL)
		return;    
    if((*Arbol)->clave < valor)
		EliminarNodo(&(*Arbol)->derecho, valor);
    else if ((*Arbol)->clave > valor)
		EliminarNodo(&(*Arbol)->izquierdo, valor);
    else if ((*Arbol)->clave == valor)
    {
		Aux = *Arbol;
		if((*Arbol)->izquierdo == NULL)
            *Arbol=(*Arbol)->derecho;
		else if ((*Arbol)->derecho == NULL)
            *Arbol=(*Arbol)->izquierdo;
		else
            Reemplazar(&(*Arbol)->izquierdo, &Aux);
		free(Aux);
    }
}

void Reemplazar(NodoArbol **Arbol, NodoArbol **Aux)
{
	if((*Arbol)->derecho == NULL)
	{
        (*Aux)->clave = (*Arbol)->clave;
        strcpy((*Aux)->nombre,(*Arbol)->nombre); 
        (*Aux)->sueldo = (*Arbol)->sueldo;
        *Aux = *Arbol;
        *Arbol = (*Arbol)->izquierdo;
	}
	else
        Reemplazar(&(*Arbol)->derecho, Aux);
}