unir dos listas enlazadas
Alguien en el foro tiene un programa que una dos listas ya creadas circulares, las una y las ordene?
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.
Te advierto, que para entenderlo necesitas saber que son pointers,clases y clases genericas.
Si te interesa te lo mando.
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 <<
// 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 <<
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;
}
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;
}
