Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/05/2006, 20:56
baggio94
 
Fecha de Ingreso: mayo-2006
Mensajes: 2
Antigüedad: 18 años, 8 meses
Puntos: 0
Problema Fantasma:limite de memoria en C????Ayuda Urgente!

Tengo un problema que no me deja dormir!! si pueden por lo menos decir donde esta el error, o el por qué se produce, estaria mucho mas tranquilo.

Aca esta el programa en donde inserta sin problemas 9000 nodos del 1 al 9 al arbol AVL, pero luego colocas imprimir en inorden y se queda pegado en 5000 y algo, o sino prueba buscando por ejemplo el 6000 y dice no esta, sin embargo colocas el 3000 y dice si esta.
Ojala puedas decirme a que se debe, para tener una base, yo creo que es a que no tiene memoria suficiente o no se, puede que este mala la funcion , pero no croe pk sino no funcionaria para los primeros 2000 o 3000

Código:
#include<stdio.h>    
#include<conio.h>    
#include<alloc.h>
#include<stdlib.h>
//*** constantes
#define true  1
#define false 0
/////////////***** declaracion de estructuras a utilizar *****//////////
struct nodo
{
   int info;
	struct nodo *der;
   struct nodo *izq;
   int altura;
};

typedef struct nodo *arbol;
///////////////***** declaracion de funciones *****//////////////////////

void menu_insertar(arbol *a);
void ingresar(arbol *a,int e);
void menu_eliminar(arbol a);
void balancear(arbol *a);
void ActualizarAltura(arbol *a);
int altura(arbol a);
void rota_simple(arbol *a);
void rota_doble(arbol *a);
int max(int a,int b);
void rotar_s(arbol *a,int bool);
void rotar_d(arbol *a,int bool);
int esta_arbin(arbol a, int elem);
void inorden(arbol a);

///////////////////////////////////////////////////////////////////////
void main()
{
	arbol a;
	a=NULL;  ///inicio arbol a en NULL
	menu_insertar(&a);
	menu_eliminar(a);
}


//////////////////////***** menu insertar *****//////////////////////////////
void menu_insertar(arbol *a)
{
	int op,elem,cont;
	cont=1;
	while(op!=2)
	{

		clrscr();
		printf("M e n u    I n s e r c i o n\n");
		printf("  A r b o l   A V L\n");
		printf("1...Ingresar un Elemento.\n");
		printf("2...VER RECORRIDO ARBOL Eliminar un Elemento\n\n");
		printf("Elija Opcion: \n\n");
		scanf("%i", &op);
		if(op==1)
		{
			while (cont<=9000)
			{
			//printf("Ingrese el Elemento: \n");
			elem=cont;
			printf("%d \n",elem);
			ingresar(&(*a),elem);
			cont++;
			}
		}

	}

}
//////////////////***** ingresar  en un arbol AVL ****///////////////////
void ingresar(arbol *a,int e) /////ingreso un elemento al arbol AVL
{
	arbol aux;
	if (*a == NULL)
	{
		aux = (arbol) malloc(sizeof(nodo));
		aux->info=e;
		aux->der=NULL;
		aux->izq=NULL;
		*a=aux;
	}else
	{
		if ((*a)->info < e)
		{
			ingresar(&((*a)->der),e);
		}else
		{
			if ((*a)->info > e)
			{ ingresar(&((*a)->izq),e);
			}
		}
	}
	balancear(a); //funcion que comprueba cada vez que se inserta un elemento al arbol AVL si esta o no balanceado
	ActualizarAltura(a);//una vez balanceado se recalcula la altura de los subarboles
}
//////////////////////////////////////////////////////////////////////
void menu_eliminar(arbol a)
{
	int e,c,opcion=7;
	while (opcion!=6)
	{

		clrscr();
		printf("M e n u  RECORRIDO\n");
		printf("  A r b o l   A V L\n\n");
		printf( "OPCION\n");
		printf("1- esta o no un elemento\n");
		printf("2- Mostrar el recorrido del arbol AVL en inorden\n");
		printf("3- Salir\n");
		("Opcion: ");
		scanf("%i",&opcion);
		if (opcion==1)
		{
		printf("Ingresa el elemento:");
		scanf("%i",&e);
		if (esta_arbin(a,e))
		printf("SI ESTA");
		else printf("NO ESTA");
		}
		getch();
		if (opcion==2)
		{
			inorden(a);
			getch();
		}
		if (opcion==3)
		{
			break;
		}

	}
}
//////////////////////////////////////////////////////////////////////////
void inorden(arbol a)    ///imprime recorrido inorden en pantalla
{                             //izq-raiz-der
	if (a!=NULL)
   {
	   inorden(a->izq);
		printf("%i,",a->info);
	   inorden(a->der);
   }
}
///calcula la altura del subarbol a
int altura(arbol a)
{
	if(a==NULL){
		return -1;
	}else{
	   return a->altura;
	}
}
/////////////////////////////////////////////////////////////////////////
void ActualizarAltura(arbol *a)
{
  if(*a!=NULL){
  (*a)->altura=max(altura((*a)->izq),altura((*a)->der))+1;	}
}
/////////////////////////////////////////////////////////////////////////
int max(int a,int b)
{
	if(a>b){
	   return a;
	}else{
		return b;
	}
}
/////////////////////////////////////////////////////////////////////////
void balancear(arbol *a)
{
	if(*a!=NULL){
		if ((altura((*a)->izq) - altura((*a)->der))==2){//si esta desbalanceado a izquierda
			if(altura((*a)->izq->izq) >= altura((*a)->izq->der)){
				rotar_s(a,true);
			}else{
				rotar_d(a,true);
			}
		}else{
			if (altura((*a)->der) - altura((*a)->izq)==2){
				if(altura((*a)->der->der) >= altura((*a)->der->izq)){
					rotar_s(a,false);
				}else{
					rotar_d(a,false);
				}
			}
		}
	}
}
/////////////////////////////////////////////////////////////////////////
void rotar_s(arbol *a,int izq)
{
	arbol aux;           ////rotaciones simples
	if (izq){
		aux=(*a)->izq;
		(*a)->izq=aux->der;
		aux->der=*a;
	}else{
		aux=(*a)->der;
		(*a)->der=aux->izq;
		aux->izq=*a;
	}
	ActualizarAltura(a);
	ActualizarAltura(&aux);
	*a=aux;
}
/////////////////////////////////////////////////////////////////////////
void rotar_d(arbol *a,int izq)
{                              ///rotaciones dobles
  if(izq){
	  rotar_s(&((*a)->izq),false);
	  rotar_s(&(*a),true);
  }else{
	 rotar_s(&((*a)->der),true);
	 rotar_s(&(*a),false);
  }
}

////////***** Funcion q verifica si esta un elemento dado *****/////////////
int esta_arbin(arbol a, int elem)
{
	if(a==NULL)
	{
		return false;
	}else{
		if(elem==a->info){
			return true;
		}else{
			return(esta_arbin(a->izq,elem)==true||esta_arbin(a->der,elem)==true);
		}
	}

}