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

Problema Fantasma:limite de memoria en C????Ayuda Urgente!

Estas en el tema de Problema Fantasma:limite de memoria en C????Ayuda Urgente! en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/05/2006, 20:56
 
Fecha de Ingreso: mayo-2006
Mensajes: 2
Antigüedad: 18 años, 7 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);
		}
	}

}
  #2 (permalink)  
Antiguo 13/05/2006, 01:05
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
No encontre problema.

Ya lo he compilado y ejecutado y no encontre problema alguno, mas que un warning por el uso de una libreria marcada como deprecate.

ademas la libreria alloc.h no se utiliza.

aumente el numero a 90000, y funciono correctamente.
Saludos..
  #3 (permalink)  
Antiguo 13/05/2006, 11:58
 
Fecha de Ingreso: mayo-2006
Mensajes: 2
Antigüedad: 18 años, 7 meses
Puntos: 0
hola, que compilador usaste??
a mi no me funciona con el turbo c++ 3.0
  #4 (permalink)  
Antiguo 13/05/2006, 16:17
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Dev Cpp

YO compile con el Dev C++.

Probablemente sea ese tu problema, aunque no estoy del todo seguro, si el Turbo C++, y los programas compildos en el se ejecutan en modo real.(O al menos en una simulacion de este). Esto limitaria la capacidad de memoria usada por el programa.

Puedes descargarte el Dev Cpp y probar a ver que tal te funciona...
Si haces esto, comenta la inclucion del conio y sustituye el clrscr() por system("cls")


Saludos.
  #5 (permalink)  
Antiguo 15/05/2006, 13:50
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Comprueba que cada malloc no devuelva NULL, y si lo hace, entonces es que no hay más memoria.
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 18:25.