Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[CONSULTA] Algoritmos Colas
Autor Mensaje
neverkas Sin conexión
Empleado de Fotocopiadora
Sin estado :(
**

Ing. en Sistemas
Otra

Mensajes: 32
Agradecimientos dados: 2
Agradecimientos: 2 en 1 posts
Registro en: Feb 2011
Mensaje: #1
[CONSULTA] Algoritmos Colas Dudas y recomendaciones Algoritmos y Estructuras de Datos
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;
}

31-07-2018 17:24
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
luchovl2 Sin conexión
Presidente del CEIT
Dígame, Ingeniero.
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.335
Agradecimientos dados: 24
Agradecimientos: 356 en 324 posts
Registro en: May 2009
Mensaje: #2
RE: [CONSULTA] Algoritmos Colas
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
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
neverkas Sin conexión
Empleado de Fotocopiadora
Sin estado :(
**

Ing. en Sistemas
Otra

Mensajes: 32
Agradecimientos dados: 2
Agradecimientos: 2 en 1 posts
Registro en: Feb 2011
Mensaje: #3
RE: [CONSULTA] Algoritmos Colas
(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?
(Este mensaje fue modificado por última vez en: 31-07-2018 19:31 por neverkas.)
31-07-2018 19:03
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
luchovl2 Sin conexión
Presidente del CEIT
Dígame, Ingeniero.
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.335
Agradecimientos dados: 24
Agradecimientos: 356 en 324 posts
Registro en: May 2009
Mensaje: #4
RE: [CONSULTA] Algoritmos Colas
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.
(Este mensaje fue modificado por última vez en: 31-07-2018 20:35 por luchovl2.)
31-07-2018 20:34
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] luchovl2 recibio 1 Gracias por este post
neverkas (02-08-2018)
neverkas Sin conexión
Empleado de Fotocopiadora
Sin estado :(
**

Ing. en Sistemas
Otra

Mensajes: 32
Agradecimientos dados: 2
Agradecimientos: 2 en 1 posts
Registro en: Feb 2011
Mensaje: #5
RE: [CONSULTA] Algoritmos Colas
(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.
05-08-2018 14:00
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)