Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alea en 3 Marzo 2012, 03:05 am



Título: nodos
Publicado por: alea en 3 Marzo 2012, 03:05 am
tengo un problema con eliminar no se si alguien me puede ayudar.. ahi les pongo
mi ejercicio solo falta el eliminar nada mas


#include<iostream.h>
#include<ctype.h>
#include<conio.h>
struct nodo
{   int dato;
    nodo*sig;
};
void main ()
   {
     nodo *cab, *nuevo, *p;
     cab=NULL;
     char op;
     int existe,numero;
     do
       {
    clrscr ();
    cout<<"PROCESOS CON LISTAS"<<endl;
    cout<<"1.-Ingresar datos a la lista"<<endl;
    cout<<"2.-Recorrer la Lista "<<endl;
    cout<<"3.-Buscar en la Lista "<<endl;
    cout<<"4.-Eliminar en la Lista "<<endl;
    cout<<"5.-Salir        "<<endl;
    cout<<"Ingrese la opcion:"<<endl;
    op=getch();
    switch (op)
       {
        case '1':
            nuevo=new nodo;
            cout<<"Ingrese el n—mero:";
            cin>>nuevo->dato;
            nuevo->sig=NULL;
            if (cab==NULL){cab=nuevo;}
            else{
           p=cab;
           while (p->sig!=NULL)
             p=p->sig;
             p->sig=nuevo;
          }
             break;

        case '2' :
         p=cab;
             if (cab==NULL)
            cout<<"La lista esta vacia";
             else{
           do{
              cout<<p->dato<<endl;
              p=p->sig;
           }while (p->sig!=NULL);
          cout<<p->dato<<endl;
             }
             getch ();

             break;
         case '3' :
             p=cab;
             cout<<"Ingrese el numero a buscar:";
             cin>>numero;
             existe=0;
             do
         {
            if(numero==p->dato)
               existe=1;
            p=p->sig;
         }while (p->sig!=NULL);
         if(existe==1)
            cout<<"NUMERO SI EXISTE EN LA LISTA"<<endl;
         else
            cout<<"***NO EXISTE EN LA LISTA ****"<<endl;
         getch();
         case '4' :
             p=cab;
             cout<<"Ingrese el numero a eliminar:";
             cin>>numero;
             existe=0;
            
             do
         {
            if(numero==p->dato)
               existe=1;
            p=p->sig;
            delete p;
         }while (p->sig!=NULL);
         if(existe==1)
            cout<<"NUMERO ELIMINADO DE LA LISTA"<<endl;
         else
            cout<<"***NO EXISTE EN LA LISTA ****"<<endl;
         getch();

        }
      }while (op!='5');
  }


Título: Re: nodos
Publicado por: Xandrete en 3 Marzo 2012, 10:45 am
Hombre, hay más cosas.

En C++ se incluye iostream y cctype, no iostream.h ni ctype.h.

El main siempre debería ser una función que devuelva un entero, no void main(). Mírate el post con chincheta de "Lo que no se debe hacer en C/C++" o compila con la opción -Wall.

También sobra el conio.h. Todo lo que haces se puede hacer perfectamente con las librerías estándar.

Otra cosa. Estás en C++, no en C. Aquí puedes declarar variables en cualquier parte del código, no hace falta que las declares todas al principio de la función. De hecho, es un buen hábito declarar las variables cuando estrictamente las necesites, en el ámbito de visibilidad donde se vaya a utilizar. Por ejemplo, nuevo y p las podrías haber declarado perfectamente dentro del switch. Además, en C++ tienes las variables de tipo booleano. Puedes declarar existe como bool y así quedaría mucho más clara su función.

Utiliza las etiquetas Geshi para poner el código. Será más fácil de leer para los demás.

Por otro lado, has de tener en cuenta que al eliminar un nodo, el nodo anterior ha de apuntar al nodo que apuntaba el elemento que has eliminado. Es decir: sea Pn el nodo a eliminar, P(n-1) el nodo anterior y P(n+1) el nodo posterior. Pn->sig = P(n+1). Pues bien, has de asegurarte de que antes de eliminar Pn, P(n-1)->sig = P(n+1). Aparte de eso, cometes otro error. En el do-while hay un delete p que lo que hará es eliminar el nodo actual, sea o no el que buscas. Y si lo eliminas, p->sig ya no tiene sentido. El problema es doble: eliminas un nodo que no es el que toca y además no puedes garantizar que puedes acceder al siguiente nodo en la lista.

Para cuando corrijas todo esto, acuérdate de que a la hora de realizar una búsqueda, no hace falta que recorras toda la lista. En cuanto veas que has encontrado el elemento deseado, paras. Tanto en la búsqueda como en la eliminación no has tenido en cuenta esto, y en los dos casos recorres de cabo a rabo la "lista" (que en realidad es una cola).

Saludos