Listas Doblemente enlazadas
Necesito hacer un programa usando listas doblemente enlazadas, que inserte, elimine, busque datos en la lista....
Te puedo ayudar con tus listas doblemente enlazadas.
Con ejercicios resueltos, ordenados,indentados y muy bien explicados en cada sentencia.
Escribeme si queres los ejercicios(resueltos).
Con ejercicios resueltos, ordenados,indentados y muy bien explicados en cada sentencia.
Escribeme si queres los ejercicios(resueltos).
SOY PRIMERISO EN ESTO DE LA PROGRAMACIÓN Y ESTOS DESESPERADO PUES ME CUESTA MUCHO LA PROGRAMACIÓN, Y AUNQUE ESTOY ESTUDIANDO MUCHO, NO ME SALEN MUY BIEN LAS COSAS.
Amigo te agradeceria si me ayudas con listas doblemente enlazadas, tengo que realizar un trabajo en el cual debo manejar información de alumnos, ingresarlos, borrarlos, buscar, ordenar, ingresar datos como nombre apellidos , carnet, notas. SI PUEDES AYUDARME TE AGRADECERIA.
SALUDOS DENNIS
Amigo te agradeceria si me ayudas con listas doblemente enlazadas, tengo que realizar un trabajo en el cual debo manejar información de alumnos, ingresarlos, borrarlos, buscar, ordenar, ingresar datos como nombre apellidos , carnet, notas. SI PUEDES AYUDARME TE AGRADECERIA.
SALUDOS DENNIS
y la pregunta sería......?, supongo que no quieres que te manden el programa entero y funcionando......
Este es un ejemplo sacado de la ayuda de la biblioteca estándar. Muestra cómo crear una lista, insertar, eliminar elementos de la lista y ordenarla. Justo el programa que estabas buscando!!!
#include <list>
#include <string>
#include <iostream>
using namespace std;
// Print out a list of strings
ostream& operator<<(ostream& out, const list<string>& l)
{
copy(l.begin(), l.end(),
ostream_iterator<string,char>(cout," "));
return out;
}
int main(void)
{
// create a list of critters
list<string> critters;
int i;
// insert several critters
critters.insert(critters.begin(),"antelope");
critters.insert(critters.begin(),"bear");
critters.insert(critters.begin(),"cat");
// print out the list
cout << critters << endl;
// Change cat to cougar
*find(critters.begin(),critters.end(),"cat") = "cougar";
cout << critters << endl;
// put a zebra at the beginning
// an ocelot ahead of antelope
// and a rat at the end
critters.push_front("zebra");
critters.insert(find(critters.begin(),critters.end(),
"antelope"),"ocelot");
critters.push_back("rat");
cout << critters << endl;
// sort the list (Use list's sort function since the
// generic algorithm requires a random access iterator
// and list only provides bidirectional)
critters.sort();
cout << critters << endl;
// now let's erase half of the critters
int half = critters.size() >> 1;
for(i = 0; i < half; ++i) {
critters.erase(critters.begin());
}
cout << critters << endl;
return 0;
}
Program Output
cat bear antelope
cougar bear antelope
zebra cougar bear ocelot antelope rat
antelope bear cougar ocelot rat zebra
ocelot rat zebra
#include <list>
#include <string>
#include <iostream>
using namespace std;
// Print out a list of strings
ostream& operator<<(ostream& out, const list<string>& l)
{
copy(l.begin(), l.end(),
ostream_iterator<string,char>(cout," "));
return out;
}
int main(void)
{
// create a list of critters
list<string> critters;
int i;
// insert several critters
critters.insert(critters.begin(),"antelope");
critters.insert(critters.begin(),"bear");
critters.insert(critters.begin(),"cat");
// print out the list
cout << critters << endl;
// Change cat to cougar
*find(critters.begin(),critters.end(),"cat") = "cougar";
cout << critters << endl;
// put a zebra at the beginning
// an ocelot ahead of antelope
// and a rat at the end
critters.push_front("zebra");
critters.insert(find(critters.begin(),critters.end(),
"antelope"),"ocelot");
critters.push_back("rat");
cout << critters << endl;
// sort the list (Use list's sort function since the
// generic algorithm requires a random access iterator
// and list only provides bidirectional)
critters.sort();
cout << critters << endl;
// now let's erase half of the critters
int half = critters.size() >> 1;
for(i = 0; i < half; ++i) {
critters.erase(critters.begin());
}
cout << critters << endl;
return 0;
}
Program Output
cat bear antelope
cougar bear antelope
zebra cougar bear ocelot antelope rat
antelope bear cougar ocelot rat zebra
ocelot rat zebra
Se puede hacer sin usar las estandares:
class TNodo { public:
TNodo *next, *prev;
void *data;
TNodo (void *d): data(d) { prev=next=0L; }
~TNodo() { delete data; }
};
class TLista { public:
TNodo *base, *head;
TLista (): base(0L), head(0L) { }
~TLista ();
void insert (void *data);
void *at (int pos);
int pos (void *ptr);
void detach (void *ptr);
};
TLista::~TLista ()
{
while (base) {
TNodo *tmp =base;
base=base->next;
delete tmp;
}
}
void TLista::insert (void *data)
{
TNodo *q=TNodo(data);
head->next=q;
q->prev=head;
head=q;
}
void *TLista::at (int pos)
{
int i=0; TNodo* tmp=base;
while(tmp) {
if (i==pos) return tmp->data;
tmp=tmp->next; i++;
}
return NULL;
}
int TLista::pos (void *ptr)
{
int i=0; TNodo *tmp=base;
while (tmp) {
if (tmp->data==data) return i;
tmp=tmp->next; i++;
}
return -1;
}
void TLista::detach (void *ptr)
{
if (pos(ptr)!=-1) {
if (pos->next)
pos->next->prev=pos->prev;
if (pos->prev)
pos->prev->next=pos->next;
if (q==base)
base=q->next;
}
}
class TNodo { public:
TNodo *next, *prev;
void *data;
TNodo (void *d): data(d) { prev=next=0L; }
~TNodo() { delete data; }
};
class TLista { public:
TNodo *base, *head;
TLista (): base(0L), head(0L) { }
~TLista ();
void insert (void *data);
void *at (int pos);
int pos (void *ptr);
void detach (void *ptr);
};
TLista::~TLista ()
{
while (base) {
TNodo *tmp =base;
base=base->next;
delete tmp;
}
}
void TLista::insert (void *data)
{
TNodo *q=TNodo(data);
head->next=q;
q->prev=head;
head=q;
}
void *TLista::at (int pos)
{
int i=0; TNodo* tmp=base;
while(tmp) {
if (i==pos) return tmp->data;
tmp=tmp->next; i++;
}
return NULL;
}
int TLista::pos (void *ptr)
{
int i=0; TNodo *tmp=base;
while (tmp) {
if (tmp->data==data) return i;
tmp=tmp->next; i++;
}
return -1;
}
void TLista::detach (void *ptr)
{
if (pos(ptr)!=-1) {
if (pos->next)
pos->next->prev=pos->prev;
if (pos->prev)
pos->prev->next=pos->next;
if (q==base)
base=q->next;
}
}
Martín:
disculpa que no haya visto tu aporte antes de hoy, pero si todavía estás allí, quisiera decirte que no veo ninguna razón válida para preferir el código artesanal al uso de los contenedores estándar. Éstos están optimizados a niveles muy difíciles de imitar, y sobre todo, ya están probados. Sin ir más lejos, donde dices:
TLista::~TLista ()
{
while (base) {
TNodo *tmp =base;
base=base->next;
delete tmp;
}
}
estás usando "delete tmp;" cuando tmp no fue creado con "new", y eso de liberar la memoria ajena indefectiblemente lleva al desastre, lo que por lo menos significa horas de depuración, con suerte.
Alejandro
disculpa que no haya visto tu aporte antes de hoy, pero si todavía estás allí, quisiera decirte que no veo ninguna razón válida para preferir el código artesanal al uso de los contenedores estándar. Éstos están optimizados a niveles muy difíciles de imitar, y sobre todo, ya están probados. Sin ir más lejos, donde dices:
TLista::~TLista ()
{
while (base) {
TNodo *tmp =base;
base=base->next;
delete tmp;
}
}
estás usando "delete tmp;" cuando tmp no fue creado con "new", y eso de liberar la memoria ajena indefectiblemente lleva al desastre, lo que por lo menos significa horas de depuración, con suerte.
Alejandro
