Professional Documents
Culture Documents
#include <iostream>
using namespace std;
class nodo
{
private:
int info;
nodo *sig;
public:
nodo(int,nodo *);
int Getinfo() {return info;}
nodo *Getsig() {return sig;}
void Setinfo(int i) {info=i;}
void Setsig (nodo *n) {sig=n;}
};
Info sig
class lista
{
private:
nodo *p;
public:
lista(); //constructor sin argumentos; (agregar el
constructor copia)
~lista(); //destructor
void altafin(int); // alta al final
void altaprin(int); //alta al principio
//baja de la primera aparicion de un elemento determinado
// modificarlo para que realice la baja de todas las apariciones
void baja(int);
bool esta(int)const; // retorna un bool indicando si el entero
pasado por argumento está en la lista
void emite()const; //emite la lista
};
O b j e t o s n o d o
Objeto lista
//Alta al principio
//Se puede plantear así:
//Esté nulo o no el puntero de entrada, mediante un puntero auxiliar aux
//generamos un nuevo nodo.
//El atributo sig del nodo nuevo debe apuntar al primer nodo de la lista
//Luego reasignamos p haciendo que apunte al nodo nuevo, que de esta
forma se convierte en el primero de la lista
/*
En código:
aux=new nodo (x); //Se genera el nodo con x en el atributo info
aux->Setsig(p); //asi el siguiente de aux apunta al primer nodo
p= aux; //p apunta al nodo nuevo
//Alta al final
//con un puntero auxiliar, si no está nulo el puntero de entrada,
//recorremos la lista hasta apuntar al nodo que tiene NULL en sig. La
//dirección del nodo nuo debe quedar almacenada en el atributo sig
del //último nodo.
void lista::altafin(int x)
{
nodo *aux=p; //asignamos p a aux, aunque no sabemos si p es nulo o no
while ((aux)&&(aux->Getsig()))
aux=aux->Getsig();
//es decir, mientras aux no sea nulo (por haber sido nulo p) y no sea
nulo //el puntero sig del nodo apuntado por aux, avanzamos.
if (aux)
//Si el puntero aux esta nulo, es porque p está nulo, entonces generamos
//el nodo nuevo desde p
}
void lista::baja(int x)
//Elimina la primera aparicion del dato pasado por argumento
//Ejercicio: analizar el código y modificarlo para que elimine todos los
//nodos con el valor pasado
{
if (p)
{
if((p->Getinfo()!=x) && (p->Getsig()))
{
nodo *aux1 =p, *aux2 =p->Getsig();
while ((aux2->Getinfo()!=x) && (aux2->Getsig()!=NULL))
{
aux1=aux2 ;
aux2 =aux2->Getsig();
}
if (aux2->Getinfo()==x)
{
aux1->Setsig(aux2->Getsig());
delete aux2;
}
}
else if(p->Getinfo()==x)
{
nodo *aux =p;
p=p->Getsig();
delete aux;
}
}
}
lista::~lista()
{
if (p)
{
nodo *aux=p;
while (aux)
{
p=p->Getsig();
delete aux;
aux=p;
}
}
}
void lista::emite()const
{
nodo *aux=p;
while (aux)
{
cout<<aux->Getinfo();
aux=aux->Getsig();
}
}
lista::lista():p(0){}
int main()
{
lista l;
cout<<"\n alta al final de 1\n";
l.altafin(1);
l.emite();
cout<<"\n alta al final de 2\n";
l.altafin(2);
l.emite();
cout<<"\n alta al final de 3\n";
l.altafin(3);
l.emite();
cout<<"\n alta al final de 4\n";
l.altafin(4);
l.emite();
cout<<"\n alta al principio de 5\n";
l.altaprin(5);
l.emite();
cout<<"\n baja 4\n";
l.baja(4);
l.emite();
cout<<"\n baja 1\n";
l.baja(1);
l.emite();
cout<<endl;
system("pause");
return 0;