Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ayuda con mi examenn estrcuutuas de datos

Estas en el tema de ayuda con mi examenn estrcuutuas de datos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/11/2010, 08:01
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 6 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);
}
  #2 (permalink)  
Antiguo 04/11/2010, 19:40
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con mi examenn estrcuutuas de datos

Seria algo muy parecido a la funcion enOrden. Osea una busqueda en profundidad. Lo que habria que agregarle es que devuelva un entero. Y ahi viene el truco. Si no es el nodo correcto devolves -1. Entonces al hacer el llamado recursivo, si este devuelve -1 siggnifica que no esta en ese subarbol, entonces no imprimis el nodo. Si este devuelve un valor positivo, osea el salario, entonces eso significa que el nodo estaba en el camino. Entonces imprimis el nodo, y luego retornas el salario del nodo, mas el valor que devolvio el llamado recursivo.

Espero haberte ayudado!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:55.