UTNianos

Versión completa: [CONSULTA] Algoritmos Colas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, estaba adelantando algunos temas de la materia pero me trabé con "colas", creo que entendí el concepto "FIFO" de Primero entra, Primero Sale. El siguiente algoritmo que hice funciona, pero igual no lo entendi al 100%.
Nota: no estoy acostumbrado a postear acá, avísenme si debo moverlo a otra parte.

Mis dudas serian:
1) En mi función agregar(), cuando hago fin = nuevo dato no estoy reemplazando el valor de fin->siguiente que tengo dentro del else?

2) En mi función quitar() porque no funciona si hago frente = fin->siguiente si los nodos los estoy agregando al final de la lista.

Les dejo mi código completo


#include <iostream>

using namespace std;

struct Nodo{
int dato;
Nodo *siguiente;
};

void agregar(Nodo *&, Nodo *&, int);
int quitar(Nodo *&, Nodo *&);

int main(){
Nodo *frente = NULL;
Nodo *fin = NULL;
int n;

cout << "Agregando datos.. => ";
do{
cin >> n;
if(n != -1)
agregar(frente, fin, n);
}while(n != -1);
cout << endl;

cout << "Listado => ";
while(frente != NULL)
cout << quitar(frente, fin) << ", ";
cout << endl;

return 0;
}

// funciones
void agregar(Nodo *&frente, Nodo *&fin, int dato){
Nodo *nuevo_nodo = new Nodo();
nuevo_nodo->dato = dato;
nuevo_nodo->siguiente = NULL;

if(frente == NULL)
frente = nuevo_nodo;
else{
//fin = nuevo_nodo;
fin->siguiente = nuevo_nodo;
}

fin = nuevo_nodo;
cout << dato << "," ;
}

int quitar(Nodo *&frente, Nodo *&fin){
Nodo *aux = frente;
int dato = aux->dato;

if(frente != NULL)
frente = frente->siguiente;
// frente = fin->siguiente;

delete aux;
return dato;
}

Hola neverkas.
Sí, estás pisando lo que hiciste en el else. El frente y el fin son el mismo nodo solo si hay un elemento en la cola.
En quitar no funciona lo que decís porque lo que quitás es el primer elemento, entonces el nuevo frente tiene que ser el siguiente del frente anterior, no el siguiente del último.
(31-07-2018 18:44)luchovl2 escribió: [ -> ]Hola neverkas.
Sí, estás pisando lo que hiciste en el else. El frente y el fin son el mismo nodo solo si hay un elemento en la cola.
En quitar no funciona lo que decís porque lo que quitás es el primer elemento, entonces el nuevo frente tiene que ser el siguiente del frente anterior, no el siguiente del último.

Buenas Lucho, gracias por responder.
Claro entiendo que frente y fin son el mismo nodo si existe un elemento, pero si hay mas de un elemento voy al else,
y sino lo hago de esa manera no funciona, es lo que no entiendo, recién lo modifiqué de esta manera.

if(frente == NULL)
frente = fin = nuevo_nodo;
else{
fin->siguiente = nuevo_nodo;
fin = nuevo_nodo;
}



Lo segundo sigo sin entenderlo bien, no se esta guardando en el puntero "fin" ? por eso no entiendo como es que accedo a los campos del puntero "frente" si estan en el puntero "fin".

O quizás está mal encarado, de que otra manera lo podría realizar?
Pará, está bien lo que hacés en el original. Lo que hacés en el else es hacer que el último viejo tenga como siguiente al que agregás, que se convierte en el nuevo último.
Antes pensé que lo pisabas porque no me di cuenta que el parámetro es una referencia a puntero. Lo tomé como una referencia a secas.

Sí, cuando guardás (agregar) lo hacés al final, pero cuando leés (quitar) lo hacés desde el frente. Por eso es FIFO: lo que pusiste primero lo sacás primero. Si ponés: A, B, C; lo primero que vas a sacar será A, y el nuevo frente será B. El final sigue siendo C.
(31-07-2018 20:34)luchovl2 escribió: [ -> ]Pará, está bien lo que hacés en el original. Lo que hacés en el else es hacer que el último viejo tenga como siguiente al que agregás, que se convierte en el nuevo último.
Antes pensé que lo pisabas porque no me di cuenta que el parámetro es una referencia a puntero. Lo tomé como una referencia a secas.

Sí, cuando guardás (agregar) lo hacés al final, pero cuando leés (quitar) lo hacés desde el frente. Por eso es FIFO: lo que pusiste primero lo sacás primero. Si ponés: A, B, C; lo primero que vas a sacar será A, y el nuevo frente será B. El final sigue siendo C.

Genial, gracias =) queria adelantarlo antes que lo diera mi profe de algoritmos, para tener una idea de como funcionaba.
URLs de referencia