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

Estoy muy agradecido contigo por tu paciencia y dedicación :)



Y me gustaría compartirte que pues la secuencia de estos códigos los hizo el profesor y él nos hace exámenes en base a este código. Asi pues me gustaría que trabajaramos si es posible en base a este código.

1. ¿Qué estoy omitiendo en este código? - Lo he analizado desde cero y aún no doy con el chiste. El profesor nos recomienda que "Busquemos" el nodo que vamos a eliminar con la función "BuscarLista()". ¿La estoy usando bien?.

Al correr el programa me elimina exitosamente sólo el primero :(.

2. También hay que evitar que se ingresen nodos repetidos. ¿Cómo logro esto modificando la función agregar(); Lo he intentado y resulta que lo que hace es dar con un bucle :(

3. ¿Qué curso de Video-tutorial en español o inglés subtitulado me recomiendas para aprender estos temas?

3.1 Programar C++
3.2 Listas Circular Simplemente enlazadas
3.3 Listas Doblemente enlazadas
3.4 Listas Circular Doblemente Enlazadas
3.5 Pilas
3.6 Colas

Código C++:
Ver original
  1. // Agrega_Clase_ListaSE.cpp: archivo de 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,*ultimo;
  61.     char resp;
  62.    
  63.  
  64.     do{
  65.  
  66.     apunt=new nodo();
  67.     anterior=new nodo();
  68.     cout<<"Entre clave del nodo a eliminar"<<endl;
  69.     cin>>apunt->dato;
  70.  
  71.     anterior=buscarLista(apunt->dato);
  72.     if(anterior==NULL)
  73.     {
  74.         if(apunt->dato==inicial->dato)
  75.         {
  76.             ultimo=buscarUltimo();
  77.             inicial->sig=ultimo;
  78.             delete apunt;
  79.         }
  80.         else
  81.         {cout<<"El nodo ha eliminar no existe"<<endl;}
  82.     }
  83.     else
  84.     {
  85.         if(apunt->dato==anterior->sig->dato)
  86.         {
  87.             anterior=anterior->sig->sig;
  88.             delete apunt;
  89.         }
  90.         else
  91.         {cout<<"El nodo ha eliminar no existe"<<endl;}
  92.     }
  93.     desplegarLista();
  94.     cout<<"Desea eliminar otro nodo? (s/n)"<<endl;
  95.     cin>>resp;
  96.     resp=tolower(resp);
  97.     }while(resp=='s');
  98.  
  99. }
  100.  
  101.  
  102. nodo *Lsec::buscarLista(int clave)
  103. {
  104.     //Devuelve la dirección del nodo que antecede al nuevo //nodo que va a ser agregado, o que va a ser eliminado.
  105.     //Si la clave es menor o igual al dato del primer nodo //el valor devuelto es NULL.
  106.     //Si la clave es mayor que el dato del último nodo //devuelve la dirección del último nodo.
  107.  
  108.     nodo *anterior; // Anterior AUXILIAR
  109.     anterior=NULL;
  110.     if(clave <= inicial->dato)return anterior;
  111.     else
  112.     {
  113.         anterior=inicial;
  114.         while ((clave > anterior->sig->dato) &&  ( anterior->sig!=inicial)  )
  115.                                                   anterior=anterior->sig;
  116.         return anterior;
  117.     }
  118. }
  119. void Lsec::agregar()
  120. {
  121.     nodo *nuevo,*anterior,*apunt,*clavenodo;
  122.     char resp;
  123.     do
  124.     {
  125.         nuevo=new nodo();
  126.         cout<<"Entre clave del nodo a agregar"<<endl;
  127.         cin>>nuevo->dato;
  128.         if(inicial==NULL)
  129.         {
  130.             //Agrega el primer nodo a la lista
  131.             inicial=nuevo;
  132.             nuevo->sig=nuevo;
  133.         }
  134.         else
  135.         {
  136.             apunt=inicial;
  137.             do
  138.             {
  139.                 if(nuevo->dato==apunt->dato)
  140.                 {cout<<"Entre clave del nodo a agregar"<<endl;}
  141.                 else
  142.                 {apunt=apunt->sig;}
  143.             }while(apunt!=inicial);
  144.             //Agrega a una lista que contiene al menos un nodo
  145.             anterior=buscarLista(nuevo->dato);
  146.             if(anterior==NULL)
  147.             {
  148.                 //Agrega un nodo que queda de primero
  149.                 //en una lista que no estaba vacia
  150.                 nodo *ultimo;
  151.                 ultimo=buscarUltimo();
  152.                 ultimo->sig=nuevo;
  153.                 nuevo->sig=inicial;
  154.                 inicial=nuevo;
  155.             }
  156.             else
  157.             {
  158.                     nuevo->sig=anterior->sig;
  159.                     anterior->sig=nuevo;
  160.             }
  161.         }
  162.         cout<<"Desea agregar otro nodo? (s/n)"<<endl;
  163.         cin>>resp;
  164.         resp=tolower(resp);
  165.     }while(resp=='s');
  166.  
  167.            
  168. }
  169. void main()
  170. {
  171.     Lsec l;
  172.     l.agregar();
  173.     l.desplegarLista();
  174.     l.eliminarNodo();
  175.     l.desplegarLista();
  176.     getch();
  177. }