elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  nodos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: nodos  (Leído 2,324 veces)
alea

Desconectado Desconectado

Mensajes: 4


Ver Perfil
nodos
« 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');
  }


En línea

Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: nodos
« Respuesta #1 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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
interconexión de nodos
Redes
nosoqui 4 4,713 Último mensaje 10 Mayo 2011, 13:06 pm
por T0rete
javascript, eliminar Nodos
Desarrollo Web
<<<-Basura->>> 4 4,344 Último mensaje 30 Septiembre 2012, 20:50 pm
por <<<-Basura->>>
No se eliminan nodos
Programación C/C++
BJM 2 2,240 Último mensaje 22 Enero 2013, 21:19 pm
por BJM
guardar nodos en txt
Programación C/C++
d91 1 5,352 Último mensaje 21 Abril 2014, 10:17 am
por eferion
Enlazar Nodos?
Programación C/C++
BrendiisFox 8 4,365 Último mensaje 13 Septiembre 2015, 12:55 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines