Ver Mensaje Individual
  #27 (permalink)  
Antiguo 04/08/2013, 15:50
ambigus
 
Fecha de Ingreso: septiembre-2008
Mensajes: 221
Antigüedad: 15 años, 7 meses
Puntos: 1
Pregunta Respuesta: Guia_Listas_Enlazadas - C++

Finalmente!!! Este código me funciona. Pero a medias :(. No me borra el primero de la lista :( ¿Qué me hace falta?

Código C++:
Ver original
  1. // Agrega_Clase_ListaSE.cpp: archivo d proyecto principal.
  2.  
  3. #include "stdafx.h"
  4. #include "iostream"
  5. #include <conio.h>
  6. using namespace System;
  7. using namespace std;
  8. struct nodo
  9. {
  10.     int dato;
  11.     nodo *sig;
  12. };
  13. class Lsec
  14. {
  15. private:
  16.     nodo *inicial;
  17.     nodo *buscarLista(int clave);
  18.     nodo *buscarUltimo();
  19. public:
  20.     Lsec();
  21.     ~Lsec();
  22.     void agregar();
  23.     void eliminarNodo();
  24.     void desplegarLista();
  25. };
  26. Lsec::Lsec()
  27. {
  28.     inicial=NULL;
  29. }
  30. Lsec::~Lsec ()
  31. {
  32. }
  33. void Lsec::desplegarLista()
  34. {
  35.     if(inicial==NULL)
  36.     {
  37.         cout<<"La lista esta vacia"<<endl;
  38.     }
  39.     else
  40.     {
  41.         nodo *apunt;
  42.         apunt=inicial;
  43.         cout<<"---LISTA ACTUAL---"<<endl;
  44.         do
  45.         {
  46.             cout<<apunt->dato<<endl;
  47.             apunt=apunt->sig;
  48.         }while(apunt!=inicial);
  49.     }
  50. }
  51. nodo *Lsec::buscarUltimo()
  52. {
  53.         nodo *ultimo;
  54.         ultimo=inicial;
  55.         while(ultimo->sig!=inicial)ultimo=ultimo->sig;
  56.         return ultimo;
  57. }
  58. void Lsec::eliminarNodo()
  59. {
  60.     nodo *anterior,*apunt, *clave;
  61.     char resp;
  62.    
  63.     apunt=new nodo();
  64.     anterior=new nodo();
  65.     clave=new nodo();
  66.  
  67.     do{
  68.         if(inicial==NULL)
  69.         {
  70.             cout<<"La lista esta vacia"<<endl;
  71.         }
  72.         else
  73.         {
  74.             apunt=inicial;
  75.             cout<<"Entre clave del nodo a eliminar"<<endl;
  76.             cin>>clave->dato;
  77.             anterior=buscarLista(clave->dato);
  78.             if(anterior==NULL)
  79.             {
  80.                 if(clave->dato==inicial->dato)
  81.                 {
  82.                     if(inicial->sig==inicial)
  83.                     {
  84.                         inicial=NULL;
  85.                     }
  86.                     else
  87.                     {
  88.                         nodo *ultimo;
  89.                         ultimo=buscarUltimo();
  90.                         ultimo->sig=inicial->sig;
  91.                        
  92.                     }
  93.                 }
  94.                 else
  95.                 {
  96.                     cout<<"El nodo ha eliminar no existe"<<endl;
  97.                 }
  98.                 delete apunt;
  99.             }
  100.             else
  101.             {
  102.                 if(clave->dato==anterior->sig->dato)
  103.                 {
  104.                     apunt=anterior->sig;
  105.                     anterior->sig=anterior->sig->sig;
  106.                     delete apunt;
  107.                 }
  108.                 else
  109.                 {
  110.                     cout<<"El nodo ha eliminar no existe"<<endl;
  111.                 }
  112.             }
  113.         }  
  114.     cout<<"Desea eliminar otro nodo? (s/n)"<<endl;
  115.     cin>>resp;
  116.     resp=tolower(resp);
  117.     }while(resp=='s');
  118.  
  119. }
  120.  
  121.  
  122. nodo *Lsec::buscarLista(int clave)
  123. {
  124.     //Devuelve la dirección del nodo que antecede al nuevo //nodo que va a ser agregado, o que va a ser eliminado.
  125.     //Si la clave es menor o igual al dato del primer nodo //el valor devuelto es NULL.
  126.     //Si la clave es mayor que el dato del último nodo //devuelve la dirección del último nodo.
  127.  
  128.     nodo *anterior; // Anterior AUXILIAR
  129.     anterior=NULL;
  130.     if(clave <= inicial->dato)return anterior;
  131.     else
  132.     {
  133.         anterior=inicial;
  134.         while ((clave > anterior->sig->dato) &&  ( anterior->sig!=inicial)  )
  135.                                                   anterior=anterior->sig;
  136.         return anterior;
  137.     }
  138. }
  139. void Lsec::agregar()
  140. {
  141.     nodo *nuevo,*anterior;
  142.     char resp;
  143.     do
  144.     {
  145.         nuevo=new nodo();
  146.         cout<<"Entre clave del nodo a agregar"<<endl;
  147.         cin>>nuevo->dato;
  148.         if(inicial==NULL)
  149.         {
  150.             //Agrega el primer nodo a la lista
  151.             inicial=nuevo;
  152.             nuevo->sig=nuevo;
  153.         }
  154.         else
  155.         {
  156.             //Agrega a una lista que contiene al menos un nodo
  157.             anterior=buscarLista(nuevo->dato);
  158.             if(anterior==NULL)
  159.             {
  160.                 //Agrega un nodo que queda de primero
  161.                 //en una lista que no estaba vacia
  162.                 nodo *ultimo;
  163.                 ultimo=buscarUltimo();
  164.                 ultimo->sig=nuevo;
  165.                 nuevo->sig=inicial;
  166.                 inicial=nuevo;
  167.             }
  168.             else
  169.             {
  170.                     nuevo->sig=anterior->sig;
  171.                     anterior->sig=nuevo;
  172.             }
  173.         }
  174.         cout<<"Desea agregar otro nodo? (s/n)"<<endl;
  175.         cin>>resp;
  176.         resp=tolower(resp);
  177.     }while(resp=='s');     
  178. }
  179. void main()
  180. {
  181.     Lsec l;
  182.     l.agregar();
  183.     l.desplegarLista();
  184.     l.eliminarNodo();
  185.     l.desplegarLista();
  186.  
  187.     getch();
  188. }