Post by Olaf (2)Creo que si me explicas esta diferencia, se iran mis dudas.
A propósrito, ¿tu me recomiendas que cuando trabaje con listas cree, un
campo mas (que se repetira en todos los nodos) con la cantidad de elementos
actual de la lista??
No hombre, lo has entendido mal.
Creas una estructura tal que:
typedef struct {
int cantidad;
nodo *primero;
} _lista;
De modo que creamos la lista así:
_lista *crear_lista (void) {
_lista *lista = malloc (sizeof(_lista));
if (lista) {
return lista;
} else {
return NULL;
}
}
Para insertar un elemento al principio de la lista sería:
int insertar_primero (_lista *lista, int dato) {
nodo *nuevo;
nuevo = (nodo *) malloc (sizeof (nodo));
if (nuevo) {
nuevo->dato = dato;
nuevo->sig = lista->primero;
lista->primero = nuevo;
return 0;
} else {
return 1;
}
}
Para crearlo al final sería:
int insertar_ultimo (_lista *lista, int dato) {
nodo *nuevo, **token;
nuevo = (nodo *) malloc (sizeof (nodo));
if (nuevo) {
nuevo->dato = dato;
nuevo->sig = NULL;
for (token = &nuevo->sig; (*token)->sig;
token = &(*token)->sig);
(*token)->sig = nuevo;
return 0;
} else {
return 1;
}
}
Post by Olaf (2)Olvidándonos de porque hacer un procedimiento para hacer eso solo... Te
"inciar" necesita recibir una direccion de memoria, por eso el &.
La direccion de memoria que recibe NO ES la direccion del primer
nodo verdad? Es la direccion que tiene un puntero a ese primer nodo?
Yo haría que iniciar devolviera el puntero a la estructura ya
inicializada como puedes ver en mi ejemplo.
Post by Olaf (2)Pero dentro del procedimiento iniciar, utilizo "*lista=NULL"
¿porque? Si lista es un puntero a una estructura _nodo (NO A NINGUN NODO
PARTICULAR)
lista apunta a un puntero que a su vez apunta a un puntero que debería
apuntar al primer elemento, pero en esa línea hacemos que apunte a
NULL.
Es decir.. metemos en la dirección de memoria al que apunta un NULL
(que es una zona de memoria donde se guarda el puntero al primer
elemento).
Post by Olaf (2)Y dentro del procedimeinto le estoy diciendo que el contenido de esa
direccion (o sea otra direccion, pero esta SI del primer nodo)
sea NULL. es cierto eso?
No entiendo el sentido de esa frase.
Post by Olaf (2)directamente un "lista=NULL" en el main hace exactamente lo mismo?
No, lista es una variable alojada en la zona de memoria reservada para
las variables privadas de la función, de modo que cuando salgas de la
función ese NULL se pierde.
Cuando pasas un parámetro por valor, se aloja en la pila dicho valor y
al finalizar la función la pila se restablece sin más.
Post by Olaf (2)Obviamente interpreto mal, porque no le deberia encontrar diferencia,
hacen exactamente lo mismo.
1) lista=NULL
Asignamos NULL a una variable local, lo cual no afectará nada al
programa porque dicho valor se desvanecerá nada más finalizar la
función.
Post by Olaf (2)2) void iniciar(nodo **lista) { *lista=NULL; }
Cambiamos la zona de memoria a la que apunta el parámetro por el valor
NULL (es decir.. cambiamos el puntero llamado "lista" por NULL).
Post by Olaf (2)Supongo que me complico con la sintaxis de los parametros.
No, simplemente aún no controlas bien los punteros. Ojalá te tubiera
delante para hacerte una clase típica de punteros en la pizarra :)
Seguro que lo pillarías fácilmente.
Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/