Listas Doblemente enlazadas

poh12
13 de Noviembre del 2008
Necesito hacer un programa usando listas doblemente enlazadas, que inserte, elimine, busque datos en la lista....

francisco ya?
13 de Noviembre del 2008
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).

Dennis
13 de Noviembre del 2008
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

joseie1
13 de Noviembre del 2008
y la pregunta sería......?, supongo que no quieres que te manden el programa entero y funcionando......

Alejandro 2.0
13 de Noviembre del 2008
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

Martin Alejandro Ribelotta
13 de Noviembre del 2008
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;
}
}













Alejandro_ (antes 2.0)
13 de Noviembre del 2008
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