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// Agrega_Clase_ListaSE.cpp: archivo de proyecto principal.
#include "stdafx.h"
#include "iostream"
#include <conio.h>
using namespace System;
using namespace std;
struct nodo
{
int dato;
nodo *sig;
};
class Lsec
{
private:
nodo *inicial;
nodo *buscarLista(int clave);
nodo *buscarUltimo();
public:
Lsec();
~Lsec();
void agregar();
void eliminarNodo();
void desplegarLista();
};
Lsec::Lsec()
{
inicial=NULL;
}
Lsec::~Lsec ()
{
}
void Lsec::desplegarLista()
{
if(inicial==NULL)
{
cout<<"La lista esta vacia"<<endl;
}
else
{
nodo *apunt;
apunt=inicial;
cout<<"---LISTA ACTUAL---"<<endl;
do
{
cout<<apunt->dato<<endl;
apunt=apunt->sig;
}while(apunt!=inicial);
}
}
nodo *Lsec::buscarUltimo()
{
nodo *ultimo;
ultimo=inicial;
while(ultimo->sig!=inicial)ultimo=ultimo->sig;
return ultimo;
}
void Lsec::eliminarNodo()
{
nodo *anterior,*apunt,*ultimo;
char resp;
do{
apunt=new nodo();
anterior=new nodo();
cout<<"Entre clave del nodo a eliminar"<<endl;
cin>>apunt->dato;
anterior=buscarLista(apunt->dato);
if(anterior==NULL)
{
if(apunt->dato==inicial->dato)
{
ultimo=buscarUltimo();
inicial->sig=ultimo;
delete apunt;
}
else
{cout<<"El nodo ha eliminar no existe"<<endl;}
}
else
{
if(apunt->dato==anterior->sig->dato)
{
anterior=anterior->sig->sig;
delete apunt;
}
else
{cout<<"El nodo ha eliminar no existe"<<endl;}
}
desplegarLista();
cout<<"Desea eliminar otro nodo? (s/n)"<<endl;
cin>>resp;
}while(resp=='s');
}
nodo *Lsec::buscarLista(int clave)
{
//Devuelve la dirección del nodo que antecede al nuevo //nodo que va a ser agregado, o que va a ser eliminado.
//Si la clave es menor o igual al dato del primer nodo //el valor devuelto es NULL.
//Si la clave es mayor que el dato del último nodo //devuelve la dirección del último nodo.
nodo *anterior; // Anterior AUXILIAR
anterior=NULL;
if(clave <= inicial->dato)return anterior;
else
{
anterior=inicial;
while ((clave > anterior->sig->dato) && ( anterior->sig!=inicial) )
anterior=anterior->sig;
return anterior;
}
}
void Lsec::agregar()
{
nodo *nuevo,*anterior,*apunt,*clavenodo;
char resp;
do
{
nuevo=new nodo();
cout<<"Entre clave del nodo a agregar"<<endl;
cin>>nuevo->dato;
if(inicial==NULL)
{
//Agrega el primer nodo a la lista
inicial=nuevo;
nuevo->sig=nuevo;
}
else
{
apunt=inicial;
do
{
if(nuevo->dato==apunt->dato)
{cout<<"Entre clave del nodo a agregar"<<endl;}
else
{apunt=apunt->sig;}
}while(apunt!=inicial);
//Agrega a una lista que contiene al menos un nodo
anterior=buscarLista(nuevo->dato);
if(anterior==NULL)
{
//Agrega un nodo que queda de primero
//en una lista que no estaba vacia
nodo *ultimo;
ultimo=buscarUltimo();
ultimo->sig=nuevo;
nuevo->sig=inicial;
inicial=nuevo;
}
else
{
nuevo->sig=anterior->sig;
anterior->sig=nuevo;
}
}
cout<<"Desea agregar otro nodo? (s/n)"<<endl;
cin>>resp;
}while(resp=='s');
}
void main()
{
Lsec l;
l.agregar();
l.desplegarLista();
l.eliminarNodo();
l.desplegarLista();
}