Dev - C++ - Dudas en listas C++

 
Vista:

Dudas en listas C++

Publicado por Caballero_Joker (1 intervención) el 01/04/2010 21:44:57
Me he iniciado en lo de listas y punteros, pero aun no he podido lograr hacer un codigo que me pueda ayudar, entonces quisiera saber si alguien me puede ayudar a poder asesorarme a poder realizar un programa de listas simple y enlazadas manipularlas y guardarlas en un archivo, me seria de mucha ayuda sus opiniones.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dudas en listas C++

Publicado por XxXchuchoxXx (1 intervención) el 03/04/2010 17:36:30
Si te estas iniciando en listas y punteros te recomiendo ir paso a paso, practicar y leer cada cosa por separado, en esos ejercicios suaves desarrollaras la busqueda de errores simples que se pueden volver engorrosos. lee y busca toda la logica que hay en este algoritmo y luego me cuentas.....

lee sobre esto primero y refresca tu memoria...
http://gulttec.wordpress.com/2007/11/15/ejemplo-de-listasc/

Este es un ejemplo de listas enlazadas, en el cual se ve como agregar, eliminar y mostrar. Es un ejemplo seimple, asi que no esperen mucho de el. Esta heco en Turbo C++ 3.0 y enlazado atravez de un proyecto...

URL: http://www.mygnet.net/codigos/cplusplus/varios/listas_enlazadas.851

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
El siguiente codigo es para que ingreses numeros, eligiendo la opcion en un menú
y mientras ingresas, puedes elegir ver la lista como se ve. sigue leyendo despues del codigo.
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
struct nodo{
int info;
nodo *sgt;
};
void agrega(nodo **cab, nodo **fin);
void muestra(nodo *cab);
int main()
{ nodo *c=NULL,*f=NULL; //puntero de cabecera, y puntero de fin de lista
int opcion;
do{
system("cls");
cout<<"1) Ingresa un dato (numero entero)."<<endl;
cout<<"2) Muestra los datos ingresados."<<endl;
cout<<"ingrese opcion"<<endl;
cin>>opcion;
switch(opcion){
case 0: exit(0);break;
case 1: agrega(&c, &f);break;
case 2: muestra(c);break;
}
}
while(opcion!=0);
system("PAUSE");
return 0;
}
void agrega(nodo **cab, nodo **fin){
int num;
cout<<"ingrese informacion"<<endl;
cin>>num;
if((*cab)==NULL){
*cab = new nodo;
(*cab)->info =num;
(*cab)->sgt=NULL;
(*fin)=(*cab);
}else{
(*fin)->sgt=new nodo;
(*fin)->sgt->info=num;
(*fin)=(*fin)->sgt;
(*fin)->sgt=NULL;
}
}
void muestra(nodo *cab){
cout<<"elementos en la lista"<<endl;
nodo* temp;
temp=cab;
while ( temp != NULL){
cout<<temp->info<<" ";
temp=temp->sgt;
}
getche();
}
BUeno, para hacer listas enlazadas simples, solo creas un puntero de cabecera, en este caso llamado c, y uno de fin de lista, llamado f para hacer la inserción mas rapida.
como ves, en la lista simple, tienes una estructura con un puntero sgt, que apunta al siguiente nodo.
en la lista doble, tendrás que crear otro campo, llamado ant. para que apunte al anterior
cuando vas ingresando elementos, como dice el siguiente codigo.
void agrega(nodo **cab, nodo **fin){
int num;
cout<<"ingrese informacion"<<endl;
cin>>num;
if((*cab)==NULL){
*cab = new nodo;
(*cab)->info =num;
(*cab)->sgt=NULL;
(*fin)=(*cab);
}else{
(*fin)->sgt=new nodo;
(*fin)->sgt->info=num;
(*fin)=(*fin)->sgt;
(*fin)->sgt=NULL;
}
}
como ves, ingresas el dato, llamado num, y verificas si la cabeza (cab) es nula, si es nula se crea new nodo, que será el primero y será apuntado por cab, indicando el inicio de la lista, y el fin tambien a la vez. Si no es nulo, entonces solo tomas al puntero fin, ingresas a su campo sgt, y creas new nodo, stg esta apuntando al siguiente nodo, y puedes ingresar a su campo info haciendo (*fin)->sgt->info=num; y de paso igualas con num para agregar el nuevo valor. ahora el fin es otro, por que hay uno nuevo, etonces haces
(*fin)=(*fin)->sgt;
eso es para listas simples, si quieres ingresar datos para listas dobles, es muy similar. solo que ahora el puntero fin, será como tu OTRA CABEZA, osea que si quieres recorrerlo en sentido contrario, solo haces primero referencia a ese puntero, y ya no a cab.
la estructura se modifica como te dije en un campo, le agregas el puntero ant. y ahora tendras que modificar tambien tu modo de ingreso.
primero te fijas en la cab si es null, si es null entonces se hace el mismo proceso. solo que ahora tienes que tener en cuenta que existe ant y lo igualas a null como se hace con sgt.
pero si cab no es null, entonces haces referencia a fin, haces new nodo con fin->sgt.
(*fin)->sgt=new nodo;
ingresas el dato en el siguiete nodo.
(*fin)->sgt->info=num;
antes de hacer pasar a fin al siguiente nodo, igualas al campo ant del siguiente nodo a fin, ya que fin en este momento está apuntando al ANTERIOR DEL NUEVO NODO.
(*fin)->sgt->ant=(*fin);
ahora si, este nodo está siendo apuntado por el ant del ultimo nodo (el nuevo nodo creado), y ahora si podemos pasar a fin al ultimo nodo
(*fin)=(*fin)->sgt;
haces fin->sgt a null y listo.
(*fin)->sgt=NULL;
con esto el ingreso de datos para tu lista enlazada está terminada. ahora solo te falta el recorrido, pero es el mismo. si tomas a cab de inicio, entonces tendras que recorrerlo pasando por los punteros sgt de cada nodo.
temp = cab;
while ( temp != NULL){
cout<<temp->info<<" ";
temp=temp->sgt;
}
pero si quieres recorrerlo del ultimo al primero, entonces tendras que hacer el recorrido tomando a fin como inicio y temp se pasará por los campos ant de cada nodo
temp = fin;
while ( temp != NULL){
cout<<temp->info<<" ";
temp=temp->ant;
}
con esto está tu algoritmo terminado en un 80 por ciento
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar