Unas Veces Lo Hace Bien Otras No :S (Plis Urgente)

Iniciado por Gerik, 12 Septiembre 2010, 23:22 PM

0 Miembros y 1 Visitante están viendo este tema.

Gerik

Basicamente El Programa Debe Hacer Una Lista Circular Con n nombres, y despues eliminarlo hasta que kede solo 1, el problema es que a veces toma como borrado un nodo sin haberlo eliminado (si me hice entender)
Código (cpp) [Seleccionar]
/*****************
Librerias
*****************/
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
/*Clase nodo*/
class nodo
     {public:
      char info[30];
    nodo *sig;
      nodo *generar_nodo(char a[30])
          {nodo *n;
        n=new nodo[30];
           strcpy(n->info,a);
        n->sig=NULL;
        return n;}
      };
/*Clase lista*/
class lista_circular
     {public:
      nodo *cab;
int cant;
      lista_circular()
         {cab=NULL;
          cant=0;}
      insertar(char a[30]);
      extraer(int dato2);
      mostrar();
     };
/*Inserta en la lista*/
lista_circular::insertar(char a[30])
    {char cad[30];
     strcpy(cad,a);
     nodo *nuevo=nuevo->generar_nodo(a);
     if(!cab)
       {cab=nuevo;
        cab->sig=nuevo;
        cant++;}
     else{nodo *p;
          p=cab;
          while(p->sig!=cab)
               {p=p->sig;}
          p->sig=nuevo;
          p=p->sig;
          p->sig=cab;
          cant++;}
     }
/*muestra la lista*/
lista_circular::mostrar()
    {nodo *p=cab;
  while(p->sig!=cab)
          {cout<<p->info<<endl;
         p=p->sig;}
     cout<<p->info<<endl;}//Cierro Mostrar

/*Extrae de la lista*/
lista_circular::extraer(int dato2)
    {if(cab)
       {nodo *p,*q;
      p=cab;
        if(dato2==cant-5)
           {while(p->sig!=cab)
                 {p=p->sig;}
         if(cab->sig==cab)
               {cab=NULL;
                cant--;}
         else{cab=cab->sig;
           p->sig=cab;
                 cant--;}
           }
        else{if(dato2==cant)
               {while(p->sig!=cab)
                    {p=p->sig;}
    p->sig=cab;
                cant--;}
             else{for(int i=0;i<dato2;i++)
                     {q=p;
             p=p->sig;}
              q->sig=p->sig;
                cant--;
                delete p;}}
}else{cout<<"  NO EXISTE LISTA\n";}
    }

main()
   {lista_circular obj;
    char nombre[30];
    int aux=0;
    for(int i=0;i<5;i++)
       {cout<<"Digite El Nombre "<<i<<" De La Lista: ";
          gets(nombre);
          cout<<endl;
          obj.insertar(nombre);}
    clrscr();
    obj.mostrar();
    int aux2=obj.cant-1;
    for(int i=0;i<aux2;i++)
       {clrscr();
        randomize();
      aux=random(obj.cant)+1;
      cout<<"Cantidad De Elementos "<<obj.cant<<endl<<"Se Elimino El Elemento "<<aux<<" De La Lista."<<endl<<"Lista Actual: "<<endl;
        obj.extraer(aux);
        obj.mostrar();
        getch();}
    getch();}


Beakman

varias cosas para decir

primero: por que queres que la lista se borre "aleatoriamente"?..es decir, por que usas randomize() y random() ?

-en una parte declaras "char cad[30]"... esta de mas, no lo usas.

-en la clase nodo pones

      nodo *generar_nodo(char a[30])
      {
            nodo *n;
            n=new nodo[30];
            strcpy(n->info,a);
            n->sig=NULL;
            return n;
      }

por que pones new nodo[ "30" ] ?

-en que momento liberas memoria? solamente liberas 'p' pero asi no liberas TODO

-hacia falta que uses la conioo?    ¬¬

-etaria bueno que pongas mas comentarios, que sea mas legible

y bueno... perdoname si me estoy equivocando!! tal vez le pifie en algo.
despues lo leo mejor :)