[ Foro de C++ ]

Listas enlazadas insertar ordenadamente

03-Oct-2017 03:33
Invitado (jaromanp)
0 Respuestas

Tengo el siguiente codigo de c++ de una lista enlazada, debo implementar un metodo que inserte ordenadamente, yo lo he implementado hasta donde pude pero aun no consigo que funcione agradeceria una colaboración

// para compilar:
// g++ -g -o simple listaSimple.cpp

// g++ -std=c++11 -o simple listaSimple.cpp

#include <iostream>
#include <string>
using namespace std;

class Nodo {
private:
int valor;
Nodo *sig;

friend class Lista;

public:
Nodo(int valor, Nodo *sig=NULL){
this->valor = valor;
this->sig = sig;
}
};

typedef Nodo *apNodo;

class Lista{
private:
apNodo cabeza;
apNodo index;
public:
Lista(){
this->cabeza = NULL;
this->index = NULL;
}
~Lista(){};
void addFiFo(int valor);
void addLiFo(int valor);
void addOrdenado(int valor);
bool estaVacia();
string verLista();
string verLista2();
string verLista3();
void borrar(int valor);
void borrar2(int valor);
bool estoyUltimo();
};

bool Lista::estoyUltimo(){
return this->index->sig==NULL;
}

bool Lista::estaVacia(){
return this->cabeza==NULL;
}

//declarar los metodos
void Lista::addLiFo(int valor){
//la lista esta vacia
if (this->estaVacia()){
this->cabeza = new Nodo(valor);
}
//la lista tiene elementos
else {
apNodo item = new Nodo(valor, this->cabeza);
this->cabeza = item;
}
}

void Lista::addFiFo(int valor){
//la lista esta vacia
if (this->estaVacia()){
this->cabeza = new Nodo(valor);
}
//la lista tiene elementos
else {
this->index = this->cabeza;
while (this->index->sig){
this->index = this->index->sig;
}
this->index->sig = new Nodo(valor);
}
}

string Lista::verLista(){
string texto = "";

this->index = this->cabeza;
if (this->index){
do{
texto = texto + to_string(this->index->valor);
texto = texto + " : ";
this->index = this->index->sig;
} while(this->index);

texto = texto + "fin.";
}
return texto;
}


string Lista::verLista2(){
string texto = "";

this->index = this->cabeza;
if (this->index){
while(this->index){
texto = texto + to_string(this->index->valor);
texto = texto + " : ";
this->index = this->index->sig;
}
texto = texto + "fin.";
}
return texto;
}




string Lista::verLista3(){
string texto = "";

this->index = this->cabeza;
if (this->index){
while(!this->estoyUltimo()){
texto = texto + to_string(this->index->valor);
texto = texto + " : ";
this->index = this->index->sig;
}
if (this->index){
texto = texto + to_string(this->index->valor);
texto = texto + " : ";
}
texto = texto + "fin.";
}
return texto;
}

void Lista::borrar(int valor){
if (estaVacia()){
return;
} else {
this->index = this->cabeza;
if (this->cabeza->valor == valor){
this->cabeza = this->cabeza->sig;
delete this->index;
} else {
apNodo bas = index;
//bas = index;
index = index->sig;
while(this->index){
if (this->index->valor == valor){
this->index = bas;
apNodo xx = this->index->sig;
this->index->sig = this->index->sig->sig;
delete xx;
return;
}
bas = index;
this->index = this->index->sig;
}
}
}
}

void Lista::borrar2(int valor){
//.... pendiente por desarrollar
if (this->estaVacia()){
// :( la lista esta vacia y no hago nada :(
return;
}else {
this->index = this->cabeza;
if (this->index->valor == valor){
//el elemento a borrar esta en la cabeza
this->cabeza = this->index->sig;
delete this->index;
} else {
//el elemento a borrar puedo estar en el cuerpo
while(!estoyUltimo()){
if (this->index->sig->valor == valor){
apNodo tmp = this->index->sig;
this->index->sig = this->index->sig->sig;
delete tmp;
return;
}
this->index = this->index->sig;
}
}
}
}

void Lista::addOrdenado(int valor){
//la lista esta vacia
if(this->estaVacia()){
this->cabeza = new Nodo(valor);
}
//La lista tiene elementos
else {
//El valor ingresado es mayor a la index
this->index = this->cabeza;
if(valor<this->index->valor){
apNodo tmp = this->index;
this->cabeza = new Nodo(valor);
this->cabeza->sig= tmp;

} else {
while(!this->estoyUltimo()){
if(this->index->valor>valor){
this->index->sig = new Nodo(valor);
} else {
this->index = this->index->sig;}
} else {
apNodo tmp2 = this->index;
this->index = new Nodo(valor);
this->index->sig = tmp2;
}
}
}
}


//===[ EJEMPLO ]=========================

int main(){


Lista listaLiFo;
//realizar varias inserciones FiFo
listaLiFo.addOrdenado(30);
listaLiFo.addOrdenado(10);
listaLiFo.addOrdenado(20);
listaLiFo.addOrdenado(50);
listaLiFo.addOrdenado(40);
cout << "Lista LiFo de (10-20-30-40-50): ";
cout << listaLiFo.verLista() << endl;




}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)