unir dos listas enlazadas

diegoleo24
22 de Mayo del 2004
Alguien en el foro tiene un programa que una dos listas ya creadas circulares, las una y las ordene?

noel solw
22 de Mayo del 2004
Tengo un programa que une dos listas circulares, sin la parte del ordenamiento.
Te advierto, que para entenderlo necesitas saber que son pointers,clases y clases genericas.
Si te interesa te lo mando.

diegoleo24
22 de Mayo del 2004
Claro que me interesa Noel Solw, por favor, hazmelo llegar.

noel solw
22 de Mayo del 2004
Te envio dos files : el cpp y el correspondeinte header file. Espero que te sean de utilidad.

// program k18b1.cpp - page 375
// Circular Linked List : joint.
// written in Borland CPP ver 3.1

#include "CircList.h"
#include <string.h>

void JointProcess(CircularList<char> &a,CircularList<char> &b)
{
Node<char> *pa = a.GetBegin(),*firsta = pa,
*pb = b.GetBegin(),*firstb = pb;
while(pa->next != firsta)
pa = pa->next;
while(pb->next != firstb)
pb = pb->next;
pa->next = firstb;
pb->next = firsta;
} // JOINT PROCESS

void Process()
{
char *data1 = "abcdefgh",
*data2 = "ABCD";
CircularList <char> a(strlen(data1),data1),
b(strlen(data2),data2);
cout << setw(30) << "first giving list : " << a;
cout << setw(30) << "second giving list : " << b;
JointProcess(a,b);
cout << setw(30) << "jointed list : " << a;
JointProcess(a,b); // backs to source state, to avoid destructor fail
} // PROCESS

void main()
{
clrscr();
cout << "Circular Linked List : joint.n";
cout << "-----------------------------------------------------"
"-------------------------n";
Process();
cout << "-----------------------------------------------------"
"-------------------------n";
cout << "end of program - good bye ! ! !n";
getch();
} // MAIN

/*
Circular Linked List : joint.
------------------------------------------------------------------------------
first giving list : {a,b,c,d,e,f,g,h}
second giving list : {A,B,C,D}
jointed list : {a,b,c,d,e,f,g,h,A,B,C,D}
------------------------------------------------------------------------------
end of program - good bye ! ! !
*/


//**********************************************************************


// program CircList.h - page 370
// Header File for Circular Linked List.
// written in Borland CPP ver 3.1

#include <conio.h>
#include <iostream.h>
#include <iomanip.h>

template <class T>
struct Node
{
T info;
Node<T> *next;
}; // STRUCT NODE

template <class T>
class CircularList
{
private:
Node<T> *begin;
public:
CircularList(int num = 0,T *data = NULL);
CircularList(CircularList &right);
~CircularList();
Node<T> *GetBegin() {return begin;} // GET BEGIN
void SetBegin(Node<T> *BEGIN) {begin = BEGIN;} // SET BEGIN
void Delete(Node<T> *anterior);
friend ostream &operator<<(ostream &,const CircularList &);
}; // CLASS CIRCULAR LIST

template <class T>
CircularList<T>::CircularList(int num = 0,T *data = NULL)
{
if(!data)
{
begin = NULL;
}
else
{
begin = new Node<T>;
Node<T> *p = begin;
p->info = data[0];
for(int i = 1;i < num;i++)
{
p->next = new Node<T>;
p = p->next;
p->info = data[i];
}
p->next = begin;
}
} // CIRCULAR LIST CONSTRUCTOR

template <class T>
CircularList<T>::CircularList(CircularList<T> &right)
{
Node<T> *p = right.GetBegin(),*q;
if(!p)
{
begin = NULL;
}
else
{
begin = new Node<T>;
q = begin;
q->info = p->info;
p = p->next;
while(p)
{
q->next = new Node<T>;
q = q->next;
q->info = p->info;
p = p->next;
}
q->next = begin;
}
} // CIRCULAR LIST COPY CONSTRUCTOR

template <class T>
CircularList<T>::~CircularList()
{
Node<T> *p = begin,*q;
for(;;)
{
q = p;
p = p->next;
delete q;
if(p == begin)
break;
}
} // CIRCULAR LIST DESTRUCTOR

template <class T>
void CircularList<T>::Delete(Node<T> *anterior)
{
Node<T> *actual = anterior->next;
cout << setw(30) << "delete . . . . " << actual->info;
anterior->next = actual->next;
if(actual == begin)
begin = actual->next;
delete actual;
} // CIRCULAR LIST DELETE

template <class T>
ostream &operator<<(ostream &out,const CircularList <T> &LIST)
{
Node<T> *p = LIST.begin;
if(!p)
out << "{empty list}";
else
{
out << "{" << p->info;
p = p->next;
for(;p != LIST.begin;p = p->next)
out << "," << p->info;
}
out << "}" << endl;
return out;
} // OPERATOR <<

diegoleo24
22 de Mayo del 2004
hola noel sowl, he tratado de comunicarme, pero he tenido problemas con mi equipo.
El código que me enviaste, reporta varios errores, podrías revisarlo por favor, además, a continuación te envío el código del programa que Yo hice, crea dos listas, las llena, las muestra, puede borrar un nodo, pero la función unir no trabaja bien, podrías ayudarme revisándola, es muy importante.
Gracias
#include <iostream.h>
#include <conio.h>


class nodo {
public:
nodo(int v, nodo *sig = NULL)
{
valor = v;
siguiente = sig;
siguiente1 = sig;

}

private:
int valor;
nodo *siguiente, *siguiente1, *aux;

friend class lista1;
friend class lista;


};

typedef nodo *pnodo;





class lista {
public:
lista() { actual = NULL; }
~lista();

void listac_insertar(int val);
void listac_borrar(int val);

void imprimir();
void Siguiente();
void unir();

int ValorActual() { return actual->valor; }

private:
pnodo actual;
};


lista::~lista()
{
pnodo nodo;


while(actual->siguiente != actual) {

nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}

delete actual;
actual = NULL;
}

void lista::listac_insertar(int val)
{

pnodo Nodo;
Nodo = new nodo(val);
if(actual == NULL) actual = Nodo;

else Nodo->siguiente = actual->siguiente;
actual->siguiente = Nodo;


}
void lista::unir()
{

pnodo Nodo;
//Nodo = new nodo(0);
Nodo->aux=Nodo->siguiente1;
while (Nodo->siguiente1 !=NULL)
Nodo->aux= Nodo->siguiente1;
cout <<"aqu´´i";
cout<< Nodo-> valor;




}







void lista::listac_borrar(int val)
{
pnodo nodo;

nodo = actual;

do {
if(actual->siguiente->valor != val) actual = actual->siguiente;
} while(actual->siguiente->valor != val && actual != nodo);
if(actual->siguiente->valor == val) {
if(actual == actual->siguiente) {
delete actual;
actual = NULL;
}
else {
nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}

}
else cout <<"no existe ese valor en la lista n";
}

void lista::imprimir()
{
if(actual !=NULL)
cout<<"la Lista si tiene datos y estos son: n";
pnodo nodo = actual;

do {

cout << nodo->valor << " --> ";

nodo = nodo->siguiente;
} while(nodo != actual);

cout << endl;
}

void lista::Siguiente()
{
if(actual) actual = actual->siguiente;
}



class lista1 {
public:
lista1() { actual = NULL; }
~lista1();

void listac_insertar1(int val);
void listac_borrar1(int val);

void imprimir1();
void Siguiente1();

int ValorActual() { return actual->valor; }

private:
pnodo actual;
};

lista1::~lista1()
{
pnodo nodo;


while(actual->siguiente1 != actual) {

nodo = actual->siguiente1;
actual->siguiente1 = nodo->siguiente1;
delete nodo;
}

delete actual;
actual = NULL;
}


void lista1::listac_insertar1(int val)
{
pnodo Nodo;
Nodo = new nodo(val);
if(actual == NULL) actual = Nodo;
else Nodo->siguiente1 = actual->siguiente1;
actual->siguiente1 = Nodo;
}



void lista1::listac_borrar1(int val)
{
pnodo nodo;

nodo = actual;

do {
if(actual->siguiente1->valor != val) actual = actual->siguiente1;
} while(actual->siguiente1->valor != val && actual != nodo);
if(actual->siguiente1->valor == val) {
if(actual == actual->siguiente1) {
delete actual;
actual = NULL;
}
else {
nodo = actual->siguiente1;
actual->siguiente1 = nodo->siguiente1;
delete nodo;
}

}
else cout <<"no existe ese valor en la lista n";
}

void lista1::imprimir1()
{
if(actual !=NULL)
cout<<"la Lista si tiene datos y estos son: n";
pnodo nodo = actual;

do {
cout << nodo->valor << " --> ";

nodo = nodo->siguiente1;
} while(nodo != actual);

cout << endl;
}

void lista1::Siguiente1()
{
if(actual) actual = actual->siguiente1;
}



int main()
{
lista ob2;
lista1 ob1;
int a,b,c,d,e;
cout <<"Deme los valores para ingresar en la lista n" ;
cout<< "Deme los datos <<Números enteros >>";
gotoxy(4,4);cin >>a;
gotoxy(4,5);cin >>b;
gotoxy(4,6);cin >>c;
gotoxy(4,7);cin >>d;



ob1.listac_insertar1(a);
ob1.listac_insertar1(b);
ob1.listac_insertar1(c);
ob1.listac_insertar1(d);

ob2.listac_insertar(10);
ob2.listac_insertar(2);
ob2.listac_insertar(3);
ob2.listac_insertar(4);

ob1.imprimir1();
ob2.imprimir();

ob2.unir();
ob2.imprimir();

cout << "Lista de elementos:" << endl;

cout <<"Qué dato desea borrar?";

cin >>e;

ob1.listac_borrar1(e);
cout <<"Luego de ese proceso, :n ";
ob1.imprimir1();

return 0;
}