sobre listas dinamicas

takyo
17 de Noviembre del 2005
ola tengo esta funcion de listas dinamicas

esvacia (*lista)

{
if (vacio == NULL)
return (1);
else
return (0);
}

komo supongo ke sabreis es ke devuelve 1 si esta inicializada a NULL y 0 si no esta inicializada

y lo ke kiero ke me devuelva es 1-inicializada 0-no inicializada ni creada 2-esta llena o con datos

esta funcion me devuelve lo mismo si esta llena komo si no esta nisikiera kreada

pense en mirar algun miembro de lista, pero me da error en el kaso de no estar kreada aun
(lista->miembro == algo) error y parada de ejekucion

pues mi pregunta es komo solucionar esto
osea ke me devuelva 0 kuando sepa kon certeza ke no esta kreada y 2 kuando sepa ke tiene algo ke no sea NULL

alomejor existe alguna funcion ke pueda anticiparse a los errores y ke devuelva true o false
if ( akcesible (lista->miembro) == 0)
return 0;
else
return 1;

muchas gracias de antemano

kike
17 de Noviembre del 2005
esvacia (*lista)

{
if (vacio == NULL)
return (1);
else
return (0);
}
supongo que te refieres a
esvacia (*lista)

{
if (lista == NULL)
return (1);
else
return (0);
}

si es asi esto deberia funcionar, la unica precaucion es que el puntero a lista este iniciado como null si es que esta vacio.

takyo
17 de Noviembre del 2005
lo siento pero kreo ke no me has entendido

la funcion ke busko es algo asi

esvacia(ficha *lista)
{
if (lista == NULL) /// EN EL KASO DE KE ESTE INICIALIZADA
return 0;
if (contiene_algo(lista) = 1 // EN EL KASO DE KE KONTENGA ALGO KE NO SEA NULL
return 1;

if (contiene_algo(lista)=0)// EN EL KASO DE KE NO ESTE NI INICIALIZADA NI ESTE LLENA
return -1;

}

ESTO DARIA ERROR EN EL KASO DE KE NO SE HAYA INICIALIZADO NI KREADO
PORKE SE INTENTA AKCEDER A UN MIEMBRO KE NO SE HA RESERVADO ESPACIO
Y LO KE KIERO ES KE ME DIGA SI NO ESTA NI INICIALIZADO NI KREADO

contiene_algo(ficha *lista)
{
if( lista->val != NULL)
return 1;

return 0;
}

ESPERO KE SE ME ENTIENDA LO KE BUSKO PORKE ME ESTOY HACIENDO UN LIO EXPLIKANDOLO

DE TODAS FORMAS MUCHAS GRACIAS

takyo
17 de Noviembre del 2005

FUNCIONES DE LA PRACTIKA <MENU>

1 INICIALIZAR LISTA
2 ESVACIA
3 INSERTAR
4 ULTIMA POSICION
.....

PEKEÑA TRAZA
LE DOY AL 1 >> SE INICIALIZA LA LISTA
LE DOY AL 2>> ME MIRA KE ESTA INICIALIZADA
LE DOY AL 4>> KOMO VE KE ESTA INICIALIZADA A NULL NO DEJA SEGUIR (SOLO DEJARÁ KUANDO ESVACIA(LISTA) DEVUELVA ALGO DISTINTO A 0, OSEA LISTA DISTINTO A NULL)
LE DOY AL 3>>INSERTA NODO A LISTA
LE DOY A 2>> ME DICE KE NO ESTA INICIALIZADO PORKE AHORA LISTA ES DIFENRENTE A NULL
LE DOY A 4>> AHORA SI KE ME DEJA PORKE LISTA ES DIFENRENTE A A NULL

AHORA OTRA TRAZA
2>>ES DIFERENTE A NULL POR LO KE ME DICE KE NO ESTA INICIALIZADO
4>>ERROR!!! INTENTA AKCEDER A UN MIEMBRO NO KREADO, AKI ME DEJA PASAR PORKE LISTA ES DIFERENTE A NULL
3>>LO MISMO

ENTIENDES?
UNA SOLUCION UN POKO INSANA KE HE ECHO ES PONER UNA VARIABLE = 0 Y DESPUES DE PASAR POR LA FUNCION INICIALIZAR SE KAMBIE A 1
EN TODAS LAS FUNCIONES HE PUESTO ESTE FILTRO
IF (VARIABLE == 0)
{PUTS("PRIMERO INICIALIZA");BREAK;}
FUNCION();

LO KE KIERO ES KE ME DEVUELVA LA FUNCION ESVACIO()
0>>SI ESTA INICIALIZADA
1>>SI ESTA INICIALIZADA Y KON ALGUN ELEMENTO
-1>>NINGUNO DE LOS DOS KASOS

BUENO GRACIAS POR LA ATENCION PRESTADA
UN SALUDO

kike
17 de Noviembre del 2005
Se me ocurre, que uses esa misma variable "insana" como contador de los nodos de la lista, que estableces por defecto en el constructor del nodo a -1, cuando inicias lo pones a 0 y luego cada vez que pases por la funcion de insercion aumentes en uno su valor.
Esa variable te dira si se ha iniciado (insana != -1) y en caso de que esto no sea cierto su valor te indica los la cantidad de nodos de la lista
tu funcion:

funcion (*lista)
{
if(lista->insana != -1)//si esta iniciada
{
if(lista->insana)//si no es 0
return (con elementos)
else
return (iniciada sin elementos)
}
else
return (no iniciada)
}
aunque de hecho no necesitas esta funcion, solo con que accedas a la variable insana ya tienes el resultado
-1=no iniciado
0=vacia
>0=con elementos

a ver si asi

takyo
17 de Noviembre del 2005
es buena tu idea pero no funcionara en estos kasos

si la inicializo opcion 1>> lista == NULL osea a ninguna parte de la memoria por lo ke el valor lista->insana nisikiera se podra akceder ya ke daria error

asi ke me kedo kon mi solucion ke es simplemente una variable ke no tiene nada ke ver kon lista, aunke me kedo kon la idea esa, porke tambien tengo una funcion ke me pide la longitud de la lista
solo tendria ke meterla por referencia en la funcion insertar
INSERTAR (ficha *lista, &insana);
ya se ke no hace falta pasarla por la funcion, ke kon inkrementarle a kontinuacion de la funcion sobra, pero kieren todas las operaciones en las funciones

bueno dejo zanjado este lio ke hemos hecho entre los dos

un saludo y mil gracias

TAKYO