
04/11/2010, 08:01
|
| | Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 14 años, 4 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);
}
|