Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: robluis en 8 Mayo 2012, 18:36 pm



Título: Ayuda Lista Enlazada
Publicado por: robluis en 8 Mayo 2012, 18:36 pm
Alguien me puede ayudar a realizar este programa en c++ utilizado listas enlazadas gracias!!

 Un verdugo es mandado a exterminar a n prisioneros de guerra. El exterminio lo ejecuta de la siguiente manera: los prisioneros forman un círculo alrededor del verdugo, el verdugo elige a quien fusilar primero, el verdugo cuenta, a partir del lugar donde estaba su última víctima, k prisioneros en orden de las manecillas del reloj y luego fusila al k-esimo prisionero después de su última víctima (a los muertos no los cuenta), y repite este proceso hasta que solo quede un prisionero.
El último prisionero podrá ser liberado.
El verdugo tiene un amigo entre los n prisioneros, escribe un programa que dado, n, k y la ubicación de su amigo, le diga a quien fusilar primero, para asegurar que su amigo sea el que quede libre.


Título: Re: Ayuda Lista Enlazada
Publicado por: xiruko en 8 Mayo 2012, 18:44 pm
aqui no se hacen tareas!

aunque esta guapo el ejercicio me lo apunto para hacerlo cuando acabe examenes.. xD


Título: Re: Ayuda Lista Enlazada
Publicado por: s00rk en 8 Mayo 2012, 21:39 pm
aqui no se hacen tareas!

aunque esta guapo el ejercicio me lo apunto para hacerlo cuando acabe examenes.. xD

De hecho el ejercicio se ve interesante igual luego intentare hacerlo, aunque como ya te dijeron aqui no se hacen tareas, pon lo que llevas de codigoy asi poder ayudarte en lo que podamos.


Título: Re: Ayuda Lista Enlazada
Publicado por: flony en 9 Mayo 2012, 03:00 am
lindo ejercicio lo anoto


Título: Re: Ayuda Lista Enlazada
Publicado por: s00rk en 9 Mayo 2012, 03:44 am
Bueno al final ya lo hice aunque por alguna razon no me anda bien en algunos casos aun asi ahi quien puda ayudar o nose >__<

Código
  1.  
  2. #include <iostream>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct _nodo
  8. {
  9.    int dato;
  10.    struct _nodo *siguiente;
  11. } tiponodo;
  12.  
  13. typedef tiponodo *pnodo;
  14. typedef tiponodo *Lista;
  15.  
  16. void agregarPrisionero(Lista *l, int v);
  17. void mostrarPrisioneros(Lista lista);
  18. void fusilarPrisioneros(Lista *lista, int k, int n);
  19. int getAmigo(int n, int k);
  20.  
  21. int main()
  22. {
  23.    int n, k;
  24.    cout << "Total de Prisioneros? ";
  25.    cin >> n;
  26.    cout << "Cada cuantos Prisioneros fusila? ";
  27.    cin >> k;
  28.    Lista lista = NULL;
  29.    cout << "Su amigo es el numero " << getAmigo(n, k) << endl;
  30.    for(int i = 0; i < n; i++)
  31.        agregarPrisionero(&lista, i);
  32.    cout << "Mostar Prisioneros: " << endl;
  33.    mostrarPrisioneros(lista);
  34.    //for(int x = 0; x < (n-1); x++)
  35.    fusilarPrisioneros(&lista, k, n);
  36.    cout << "Mostar Sobreviviente: " << endl;
  37.    mostrarPrisioneros(lista);
  38.    return 0;
  39. }
  40.  
  41. int getAmigo(int n, int k)
  42. {
  43.    int v = -1, tam = n, y = 1;
  44.    int amigo[n];
  45.    amigo[0] = 0;
  46.    for(int x = (n-1); x > 0; x--)
  47.    {
  48.        amigo[x] = y;
  49.        y++;
  50.    }
  51.  
  52.    while(tam > 1)
  53.    {
  54.        for(y = 0; y < k; y++)
  55.        {
  56.            v++;
  57.            while(v == n || amigo[v] == n)
  58.            {
  59.                if(v == n)
  60.                    v = 0;
  61.                else
  62.                    v++;
  63.            }
  64.        }
  65.        amigo[v] = n;
  66.        tam--;
  67.    }
  68.  
  69.    for(int x = 0; x < n; x++)
  70.        if(amigo[x] != n)
  71.            return amigo[x];
  72.  
  73.    return 0;
  74. }
  75.  
  76. void agregarPrisionero(Lista *lista, int v)
  77. {
  78.    pnodo nodo;
  79.    nodo = (pnodo)malloc(sizeof(tiponodo));
  80.    nodo->dato = v;
  81.    if(*lista == NULL)
  82.        *lista = nodo;
  83.    else
  84.        nodo->siguiente = (*lista)->siguiente;
  85.    (*lista)->siguiente = nodo;
  86. }
  87.  
  88. void fusilarPrisioneros(Lista *lista, int k, int n)
  89. {
  90.    pnodo nodo;
  91.    nodo = *lista;
  92.  
  93.    for(int x = 0; x < (k-2); x++)
  94.    {
  95.        *lista = (*lista)->siguiente;
  96.    }
  97.    if(*lista == (*lista)->siguiente)
  98.    {
  99.        free(*lista);
  100.        *lista = NULL;
  101.    }else{
  102.        nodo = (*lista)->siguiente;
  103.        (*lista)->siguiente = nodo->siguiente;
  104.        free(nodo);
  105.    }
  106.    if(n > 2)
  107.    {
  108.        *lista = (*lista)->siguiente;
  109.        fusilarPrisioneros(lista, k, n-1);
  110.    }
  111. }
  112.  
  113. void mostrarPrisioneros(Lista lista)
  114. {
  115.    pnodo nodo = lista;
  116. do{
  117.   cout << nodo->dato << " ";
  118.   nodo = nodo->siguiente;
  119. } while(nodo != lista);
  120. cout << endl;
  121. }
  122.  


Título: Re: Ayuda Lista Enlazada
Publicado por: botella en 9 Mayo 2012, 03:49 am
El ejercicio está muy bueno, yo te diría que te olvides de la lista enlazada y lo plantees primero. Igual, sabé que un prisionero apunta al de al lado y así sucesivamente, cada vez que matás a uno, el de la izquiera pasa a apuntar al siguiente luego del muerto, (el más próximo que queda vivo a la derecha). Al muerto le das un free para liberar la memoria que tenía con malloc.  El último prisionero apunta al primero. Plantealo en papel tranquilo, no es muy dificil.

Una vez que tenés bién la estructura de datos, de los prisioneros apuntandosé, tenés que hacer la función que mate al prisionero. De ahí en más empezas a buscar el algoritmo para no matar al amigo. Sabés listas?, si no sabés mandame un mp con tu e-mail que te puedo enviar las primitivas de listas y unos tutoriales. Saludos.