listas encadenadas o enlazadas para atrappame si puedes

listas encadenadas o enlazadas para atrappame si puedes

Notapor luisalbert » Lun May 02, 2011 5:03 pm

buen dia, los que les comente en el anterior hilo, se trata de realizar una lista encadenada para resolver mi dilema acerca de listas enlazadas, ahora de hallar el por que no funciona la lista es el tema de este hilo, veran cree el codigo a partir de otro que halle en internet, el profe me dice que esta bien, pero a la hora de compilar resulta que me muestra un segundo la consola y muere, que ocurre? no tengo idea aqui dejo el codigo y si me puedes ayudar a ver como dejo lo de los lobos en orden con una lista enlazada será muy util.

la lista debe ordenar los lobos así:

si le corresponde jugar al lobo 3 la lista a mostrar en pantalla es 3 4 1 2
pero si le corresponde al lobo 1 será 1 2 3 4

por cierto esto es para mi videojuego de atrapame si puedes!
recuerda que puedes ver el videojuego funcionando en
Código: Seleccionar todo
#include <iostream.h>
#include <stdlib.h>

// Declaración de la estructura NODO
struct NODO{
   int dato;
   NODO *siguiente;
};

NODO *cab; // Se declara una estructura global, NO ES OBLIGATORIO HACERLO

// Prototipos de las funciones usadas en el programa
int posicion_lista(int n); // Valida si ya existe y ubica la posición para insertar
void insertar(NODO *p, NODO *q, int n); // Inserta en la posicion adecuada
void mostrar_lista();  // Muestra todo el contenido

// Funciones usadas en el programa
int main(){
cab=NULL;
int n;
//system("CLS");
cout<<"Ingrese un nodo (999 para salir):\n";
cin>>n;
while(n!=999){
  if(posicion_lista(n) == -1){  /* valida si ya existe */
   cout<<" Repetido.\n";
  }
  cout<<"Ingrese un nodo (999 para salir):\n";
  cin>>n;
}
mostrar_lista();
}

int posicion_lista(int n){
NODO *p, *q;
int encontro=0;
p=NULL;
q=cab;
// Con el siguiente while recorremos la lista de principio a fin
// y al final *p apunta al último nodo de la lista
while(q != NULL && !encontro){
  if(n > q->dato){
   p=q;
   q=q->siguiente;
  }
  else{
   encontro=1;
  }
}
if(encontro){
  if(n == q->dato){
   return -1; // retorna -1 cuando el elemento está repetido
  }
  else{
   insertar(p,q,n);
  }
}
else{
  insertar (p,q,n);
}
return 0; // En caso de hacerse la inserci¢n correctamente retorna 0

}

void insertar(NODO *p, NODO *q, int n){
NODO *nuevo;
nuevo=new NODO;
nuevo->dato=n;
nuevo->siguiente=q;
if(p != NULL){ // Quiere decir que hay uno o más nodos ya insertados
  p->siguiente=nuevo; // Al último nodo de la lista se le encadena el nodo nuevo
}
else{
  cab=nuevo;
}
}

void mostrar_lista(){
NODO *p=cab;
cout<<"\nEl contenido de la lista es:\n";
while(p!=NULL){
  cout<<p->dato<<endl;
  p=p->siguiente;
}

}
luisalbert
 
Mensajes: 6
Registrado: Jue Abr 21, 2011 5:43 pm

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor Juanxo » Mar May 03, 2011 8:01 am

buenas luisalbert:

la verdad es que yo tampoco veo ningún fallo claro como para que de error. Pero creo que lo que tu quieres no es una lista enlazada, si no una cola.

De tu código, solo un comentario sobre posicion_lista:
// En esta función, que es lo que pretendes hacer?
// Intenta separar las cosas. Yo no esperaría que algo que se
// llame posicion_lista y que devuelva un entero me devolviera
// si un valor esta en la lista o no, si no la posición en la
// que se encuentra el elemento.
// Tampoco espero que esta función inserte cosas si no está lo que
// he pasado
// Puesto que estás mezclando C y C++, porque no usar bool en vez de int si lo que quieres es decir si está repetido?
// El encontrado es innecesario el 99% de las veces. Fijate en el "esta" de abajo como ejemplo


Aqui te pongo una manera de la que lo habría hecho yo con colas
Aviso: se puede hacer incluso mejor usando clases con metodos ( en vez de structuras y funciones vacias) y referencias (en vez de punteros para pasar la cola por referencia)
#include <iostream.h>
#include <stdlib.h>

// Declaración de la estructura NODO
struct NODO{
int dato;
NODO *siguiente;
};

struct COLA{
NODO* cabeza;
NODO* final;
};

void inicializar(COLA* cola);

// Inserta en la parte de atras de la cola
void meter(int dato, COLA* cola);
// Elimina del principio de la cola
int sacar(COLA cola);
// Comprueba si un elemento ya esta almacenado en la cola
bool esta(int dato, COLA* cola);

void mostrar_cola(COLA* cola);

void siguiente_turno(COLA* cola);



// Funciones usadas en el programa
int main(){

COLA cola;
inicializar(&cola);

for (int i = 1; i < 5; ++i)
{
meter(i, &cola);
}
// Cola: 1, 2, 3, 4
mostrar_cola(&cola);

for (int i = 0; i < 15; ++i)
{
siguiente_turno(&cola);
mostrar_cola(&cola);
}

return 0;

}

void inicializar(COLA* cola)
{
cola->cabeza = NULL;
cola->final = NULL;
}

void meter(int elemento, COLA* cola)
{
NODO* nuevo = new NODO();
nuevo->dato = elemento;
nuevo->siguiente = NULL;

if ( cola->cabeza == NULL )
{
// La cola esta vacia
cola->cabeza = nuevo;
cola->final = nuevo;
}
else
{
cola->final->siguiente = nuevo;
cola->final = nuevo;
}
}

int sacar(COLA* cola)
{
if ( cola->cabeza == NULL)
{
// esta vacia
return -1;
}
else
{
// Quitamos la cabeza y devolvemos su valor
NODO* sacado = cabeza;
cabeza = cabeza->siguiente;
int dato = sacado->dato;
delete sacado;
return dato;
}
}

bool esta(int dato, COLA* cola)
{
NODO* aux = cola->cabeza;

while (aux != NULL && dato != aux->dato)
{
aux = aux->siguiente;
}

return aux != NULL;
}

void mostrar_cola(COLA* cola)
{
NODO* aux = cola->cabeza;

while (aux != NULL)
{
cout << aux->dato << ", ";
aux = aux->siguiente;
cout << "\n";
}
}

void siguiente_turno(COLA* cola)
{
if (cola->cabeza == NULL)
{
cout << "Error: No hay elementos en la cola\n";
}
else
{
int turno_actual = sacar(cola);
cout << "Turno actual: " << turno_actual << "\n";
meter(turno_actual, cola);
}
}
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor luisalbert » Jue May 12, 2011 7:10 pm

Buen dia Juanxo, no habia regresado porque el PC me esta dando problemas, algo esta pasando que hace de mi programacion un dolor de cabeza.

por ahora te cuento, lo que quiero hacer es lograr que salgan los números de acuerdo al orden que les he dado, que esta dado por una variable llamada vector1, que lo que dice es cual de los 4 lobos juega, y a partir de ahí continuar el orden

si vector1 es 1 la lista es 1234
si vector1 es 2 la lista es 2341
si vector1 es 3 la lista es 3412
si vector1 es 4 la lista es 4123

por lo que estaba tratando de hacer un anillo que con un ciclo fuera almacenando y luego mostrando desde el primer valor que ingreso hasta el último. no como una cola, que según he leído al primero que entra se le despacha de primero y al último de último.

trate de compilar el programa que me muestras, pero, me dice incoherencias como que cabeza no esta declarado, que cout no esta declarado, en donde mencionas:
Código: Seleccionar todo
// Quitamos la cabeza y devolvemos su valor
        NODO* sacado = cabeza;

de la función int sacar(COLA* cola)
Código: Seleccionar todo
int sacar(COLA* cola)
{
    if ( cola->cabeza == NULL)
    {
        // esta vacia
        return -1;
    }
    else
    {
        // Quitamos la cabeza y devolvemos su valor
        NODO* sacado = cabeza;
        cabeza = cabeza->siguiente;
        int dato = sacado->dato;
        delete sacado;
        return dato;
    }
}


no logro entender porque dice que no esta declarada, y me esta pasando lo mismo con otros programas que estoy haciendo donde funciones que antes corrían bien ahora dice el compilador que no están declaradas, no se si al instalar alguna cosilla se ha comprometido la estabilidad del Dev C++, otra cosa es que tengo que usar el dev, pues es capricho del profe, sino creo que con gcc seria muy útil ademas de suficiente.

si me puedes dar alguna luz de que ocurre con mi compilador te lo agradezco, por ahora me concentrare en lograr una estación de trabajo estable y entonces seguir programando.
luisalbert
 
Mensajes: 6
Registrado: Jue Abr 21, 2011 5:43 pm

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor luisalbert » Jue May 12, 2011 7:14 pm

Se me paso una cosilla mas, si es una lista lo que quiero, bueno lo que el profesor me pide, la idea de "esta" es muy recursiva, pero lo que tengo que llevar es otra cosa.

te agradezco por el interés acerca de este tema.
luisalbert
 
Mensajes: 6
Registrado: Jue Abr 21, 2011 5:43 pm

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor Juanxo » Jue May 12, 2011 8:55 pm

De verdad, solo puedo darte un consejo: mata a tu profesor. Dev C++ es el peor IDE que ha existido desde hace mucho (tambn te lo digo por experiencia propia)

En cuanto a lo de los errores, ahora te subo una versión actualizada, que la anterior simplemente era para que te guiaras, no estaba pensada para ser compilada. Y lo de la cola, espera y verás como se puede ajustar a lo que necesitas. (igual tambn te subo una version con lista circular)
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor Juanxo » Jue May 12, 2011 9:04 pm

Esto me compila, y funciona correctamente:

#include <iostream>
#include <cstdlib>

// Declaración de la estructura NODO
struct NODO{
int dato;
NODO *siguiente;
};

struct COLA{
NODO* cabeza;
NODO* final;
};

void inicializar(COLA* cola);

// Inserta en la parte de atras de la cola
void meter(int dato, COLA* cola);
// Elimina del principio de la cola
int sacar(COLA cola);
// Comprueba si un elemento ya esta almacenado en la cola
bool esta(int dato, COLA* cola);

void mostrar_cola(COLA* cola);

void siguiente_turno(COLA* cola);



// Funciones usadas en el programa
int main(){

COLA cola;
inicializar(&cola);

for (int i = 1; i < 5; ++i)
{
meter(i, &cola);
}
// Cola: 1, 2, 3, 4
mostrar_cola(&cola);

for (int i = 0; i < 15; ++i)
{
siguiente_turno(&cola);
mostrar_cola(&cola);
}

system("pause");
return 0;

}

void inicializar(COLA* cola)
{
cola->cabeza = NULL;
cola->final = NULL;
}

void meter(int elemento, COLA* cola)
{
NODO* nuevo = new NODO();
nuevo->dato = elemento;
nuevo->siguiente = NULL;

if ( cola->cabeza == NULL )
{
// La cola esta vacia
cola->cabeza = nuevo;
cola->final = nuevo;
}
else
{
cola->final->siguiente = nuevo;
cola->final = nuevo;
}
}

int sacar(COLA* cola)
{
if ( cola->cabeza == NULL)
{
// esta vacia
return -1;
}
else
{
// Quitamos la cabeza y devolvemos su valor
NODO* sacado = cola->cabeza;
cola->cabeza = cola->cabeza->siguiente;
int dato = sacado->dato;
delete sacado;
return dato;
}
}

bool esta(int dato, COLA* cola)
{
NODO* aux = cola->cabeza;

while (aux != NULL && dato != aux->dato)
{
aux = aux->siguiente;
}

return aux != NULL;
}

void mostrar_cola(COLA* cola)
{
NODO* aux = cola->cabeza;

while (aux != NULL)
{
std::cout << aux->dato << ", ";
aux = aux->siguiente;
std::cout << "\n";
}
}

void siguiente_turno(COLA* cola)
{
if (cola->cabeza == NULL)
{
std::cout << "Error: No hay elementos en la cola\n";
}
else
{
int turno_actual = sacar(cola);
std::cout << "Turno actual: " << turno_actual << "\n";
meter(turno_actual, cola);
}
}
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor Juanxo » Jue May 12, 2011 9:21 pm

Con lista circular:

#include <iostream>
#include <cstdlib>

// Declaración de la estructura NODO
struct NODO{
int dato;
NODO* siguiente;
};

struct LISTA_CIRCULAR{
NODO* actual;
NODO* final;
};

void inicializar(LISTA_CIRCULAR* lista);

// Inserta en la parte de atras de la lista
void meter(int dato, LISTA_CIRCULAR* lista);
// Comprueba si un elemento ya esta almacenado en la lista
bool esta(int dato, LISTA_CIRCULAR* lista);

void mostrar_lista(LISTA_CIRCULAR* lista);

void siguiente_turno(LISTA_CIRCULAR* lista);



// Funciones usadas en el programa
int main(){

LISTA_CIRCULAR lista;
inicializar(&lista);

for (int i = 1; i < 5; ++i)
{
meter(i, &lista);
}
// Cola: 1, 2, 3, 4
mostrar_lista(&lista);

for (int i = 0; i < 7; ++i)
{
siguiente_turno(&lista);
mostrar_lista(&lista);
}

system("pause");
return 0;

}

void inicializar(LISTA_CIRCULAR* lista)
{
lista->actual = NULL;
lista->final = NULL;
}

void meter(int elemento, LISTA_CIRCULAR* lista)
{
NODO* nuevo = new NODO();
nuevo->dato = elemento;
nuevo->siguiente = NULL;

if ( lista->actual == NULL )
{
// La lista esta vacia
lista->actual = nuevo;
lista->final = nuevo;
}
else
{
lista->final->siguiente = nuevo;
lista->final = nuevo;
}
nuevo->siguiente = lista->actual;
}

bool esta(int dato, LISTA_CIRCULAR* lista)
{
NODO* aux = lista->actual;
bool centinela = false;

if (aux != NULL)
{
while ( dato != aux->dato && !centinela )
{
if (aux = lista->actual){
// Hemos dado la vuelta completa
centinela = true;
}
aux = aux->siguiente;
}

return dato == aux->dato;
}
return false;
}

void mostrar_lista(LISTA_CIRCULAR* lista)
{
NODO* aux = lista->actual;

if (aux != NULL)
{
do
{
std::cout << aux->dato << ", ";
aux = aux->siguiente;

} while (aux != lista->actual);
std::cout << "\n";
}
}

void siguiente_turno(LISTA_CIRCULAR* lista)
{
if (lista->actual == NULL)
{
std::cout << "Error: No hay elementos en la lista\n";
}
else
{
int turno_actual = lista->actual->dato;
std::cout << "Turno actual: " << turno_actual << "\n";
lista->actual = lista->actual->siguiente;
}
}
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: listas encadenadas o enlazadas para atrappame si puedes

Notapor luisalbert » Vie May 13, 2011 2:14 pm

gracias, voy a probarlo, una vez lo tenga montado en mi programa lo migrare a una clase, y luego vamos por pilas, me tienen muy intrigado, quiero verlo en mi celu funcionando, jejejeje, funcionara en cualquier celu? bueno que tenga recursos, o sólo funciona en algunos sistemas operativos mobiles?
luisalbert
 
Mensajes: 6
Registrado: Jue Abr 21, 2011 5:43 pm

cocktail white dress vamos tocar tambm em temas relacionados

Notapor vi41n4f5o1 » Sab Nov 17, 2012 7:16 am

The simple wedding dresses could also be a family heirloom or tradition that is handed down from mother to daughter. You may love nothing better than getting away from land for a peaceful day spent sailing or fishing, but you should remember that the water and t. Vamos tocar tambm em temas relacionados, por exemplo moda adolescente, moda teen e moda feminina.

The criss-cross neckline and edge-of-the-shoulder straps create a beautiful d茅colletage. The skirt gathers at the left hip, featuring a three-dimensional fabric flower in matching ink. A double-sided taffeta wrap accompanies the dress and provides just enough warmth and coverage long evening dress when you need it,

Tiara is typical for royal wedding ensemble. Luxurious, refined, classic or straight forward type, the tiara will be whichever you opt for. Yet it invariably offers a feeling of nobility and elegance that every bride really wants to hold. SMIL Dress Keep up with fashion trends, publicity personality, the charm Fashion highlights. We not only provide personalized custom services, but also a group of designers at your service. SMIL provides wedding dress customized service.

Historically, some parts of the Homam are conducted after sunset, just before the bride and groom retire for the night. As part of this, the bride and groom are taken outside and shown two stars one is the pole star and the second is Arundhati. The bride and groom are shown these stars as great personages they must try to emulate
Cheap Prom Dress

cocktail white dress vamos tocar tambm em temas relacionados
vi41n4f5o1
 
Mensajes: 2
Registrado: Sab Nov 17, 2012 5:46 am

long cocktail dress learn some new things about diabetes

Notapor vi41n4f5o1 » Sab Nov 17, 2012 7:24 am

"We are focusing on the customer that wants a variety in their shopping life. We have luxury resort to preppy everyday wear, Pam said. "We also carry a small selection of party dresses that will take you to Black Tie dinners or just a nite on the town, There's also a great line of linen clothes that work for the fuller figure 'mommies-to-be,' as well as shoes and purses that compliment the outfits,

Who says champagne A-line dresses are not ideal for seaside wedding ceremony but only formal nuptials? This champagne dress with golden embroidery information will protest that with convincing actuality. You may well first of all get the Cheap Lace Dresses sight of its champagne glamor of the skirt. This texture wedding ceremony gown has a lace-up again style and design to give a hint of seduction.

If you have any concerns about your own health or the health of your child, you should always consult with a physician or other healthcare professional. Please review the Privacy Policy and Terms of Use before using this site. Your use of the site indicates your agreement to be bound by the Terms of Use,

And you need to choose your keywords carefully. If you choose the right one, you will find the dress you want more quickly. And you can trust Google rank. Obviously, you can't have your wedding outdoors if it is raining; and you have to check the width of the aisles in the church. You also have to think of the reception. Will the gown permit you to move around and dance with ease
Classic Dresses

long cocktail dress learn some new things about diabetes
vi41n4f5o1
 
Mensajes: 2
Registrado: Sab Nov 17, 2012 5:46 am


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado