12/05/2006, 20:56
|
| | 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);
}
}
}
|