Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

programadores en c++ ayuda

DemiDante

Bovino Milenario
Desde
23 Dic 2008
Mensajes
1.000
gulp! Necesito una ayuda por favor tengo que hacer un programa en c++ aacerca de listas dinamicas pero es que tiene que realizar un doble recorrido

struct NODO{
int DATO;
struct NODO*sig;
} ;

struct NODO*InicioLista=NULL,*Recorre=NULL,*AUX=NULL;

void InsertaNodo(int Elemento){
AUX=new (Struct NODO);
AUX->DATO=Elemento;
AUX->Sig=NULL;

if (InicioLista==NULL){
InicioLista=AUX;
}
else {
Recorre=InicioLista;
while(Recorre->Sig!NULL){
Recorre=Recorre->Sig;
}
Recorre->Sig=AUX;
}
}

void ImprimirLista( ){
Recorre=InicioLista;
while(Recorre!=NULL){
cout<<Recorre->DATO<<" ";
Recorre=Recorre->Sig;
}
getch( );
}

void main( ){
int opc, Elemento
do{
cout<<"1)Insertar\n";
cout<<"2)ImprimirLista\n";
cout<<"3)Salir\n";
cout<<"Opcion : ";
cin>>opc;

if (opc==1){
cout<<"Elemento";
cin>>Elemento;
InsertaNodo(Elemento);
}
else if (opc==2){
cout<<"Elemento de la lista .... \n";
ImprimirLista( );
}
} while(opc!=3);
}

este es el programa que tengo hasta ahora pero nadamas hace un recorrido sencillo y lo que tengo que hacer es que realiza un recorrido doble, me podrian echar la mano, les estare agradecidos. :histerica:
 
como un recorrido doble explicate un poco mas para poder ayudarte...
 
pues por ejemplo que los numeros que le pongamos sean los siguientes 8,5,3,9 esos serian los apuntadores que nos lo darian en ese mismo orden, y lo que s etiene que hacer despues es es que ahora el 9 sea el primero y el 8 seria el ultimo
 
Metelo a un ciclo, con un contador, y con arreglos, por ejemlpo metelo todo a un ciclo, y cuando termine de hacer lo que dices comparalo con el contador para que vuelva a iniciar pero esta vez en arreglos y vas haciendo desde la ultima posicion hacia la primera...

Talvez declara el arreglo desde un principio...
 
Creo que puedes poner un dato de tipo NODO que sea anterior para que este te recorra hacia atras.
 
pues ahi mas o menos le entendi pero sigo en lo mismo, de todas formas gracias, le intentare a ver que sale espero segui obteniendo mas consejos de ustedes
 
mmm para que utilizar arreglos si el objetivo del programa es utilizar listas con apuntadores???

Lo copie, lo compile y lo ejecute y envia demasiados errores.. Seguro que funciona? como lo ejecutas?

Busca en algun libro de C basico el tema "Listas Doblemente Enlazadas", lo que sucede es que en tu programa tienes una lista simple enlazada y para recorrerla en sentido contrario necesitas tenerlo como lista doble.

:vientos:
 
Para realizar esto necesitas una lista doblemente enlazada, en la estructura de tu nodo ademas de guardar un enlace al siguiente nodo también debes de guardar un enlace al nodo anterior, con esto podrás recorrer tu lista ya sea para adelante o para atrás.
 
ok, primero. Olvida eso de las listas doblemente enlazadas. Tus estas usanda "listas simplemente ligasdas lineales" y claro que hay un algoritmo para hacer recorridos inversos.

Te paso el dato.
Necesitas un apuntador que siempre este apuntando al ultimo nodo, es decir cuando lo inicializas con tu lista:
Lista->8->5->3->9->NULL,
tu puntero ultimo apunta al 9: Lista->8->5->3->9(ultimo)->NULL.
El algoritmo imprime o almacena ese dato. El siguiente paso es hacer que ese puntero ULTIMO señale el numero anterior al 9 es decir el 3. No puedes hacerlo directamente pues el dato 9 no tiene un aputador hacia atras, no sabes que hay antes de el (eso es exclusivo de una lista doblemente ligada) asi que necesitaras otro puntero llamado AUX que volvera a recorrer la lista desde el principio hasta satisfacer la siguiente condicion:
(AUX->siguiente = = ULTIMO)
En este momentos te das cuenta que llegaste al dato anterior al ultimo es decir:
(3->siguiente = = 9) por lo tanto ahora el puntero ULTIMO debe señalar a AUX y asi tienes un nuevo último (ULTIMO = AUX)
Lista->8->5->3(ultimo)->9->NULL.
Se imprime ese dato y asi continuas hasta que el puntero ULTIMO sea igual a LISTA que es el comienzo de la lista. Y eso es todo.
Ya se, te preguntaras como hago para apuntar al ultimo por primera vez pues cuando comienzo la aplicacion no el sistema no es adivino; como veras el dato siguiente del 9 es NULL asi que por default ese es el primer ultimo, solo inicializa el punetro en NULL y haz que el algoritmo no imprima el dato si es igual a NULL y todo esta listo, la lista es recorrida y todo el mundo es feliz.

Suerte con las estructuras de datos; en lo personal las encuentro fascinantes y profecionalmente no saberlas usar le ha ocacionado serios problemas a ciertas gentes que conozco, asi que sigue preguntando lo que necesites
bytez.-.-
 
jajajajaja :memeo: estuvo chido eso de "es mejor que no recibas asesoria de aquellos que son mas ignorantes que tu". Disculpame pero yo no vi mas que preguntas para poder entender mejor que es lo que requeria y alguna que otra propuesta de solución de gente mas ignorante, digo ... :memeo:

Bueno al menos yo no vi un post donde dijera, "quiero hacer un doble recorrido pero SIN utilizar listas doblemente enlazadas" y si fuera el caso, entonces hacer caso omiso de este post.

Con respecto a tu solución propuesta me suena coherente, pero la vdd como que se me hace muy complicado teniendo a la mano las listas doblemente enlazadas.

En fin, como este tema es de programación .. hoy amaneci con ganas de hacerle la tarea a alguien (:histerica: y mas :histerica:) .

Esta es mi propuesta de solución , va calada va probada:

Código:
struct NODO{
int DATO;
struct NODO* sig;
[B]struct NODO* ant;
[/B]};

struct NODO* InicioLista=NULL,* Recorre=NULL,* AUX=NULL,[B]* FinLista=NULL[/B];

void InsertaNodo(int Elemento){
AUX=new (Struct NODO);
AUX->DATO=Elemento;
AUX->Sig=NULL;
[B]AUX->ant=NULL;
[/B]
if (InicioLista==NULL){
InicioLista=AUX;
}
else {
Recorre=InicioLista;
while(Recorre->Sig != NULL){
Recorre=Recorre->Sig;
}
Recorre->Sig=AUX;
AUX->ant=Recorre;
FinLista=AUX;
}
}

void ImprimirLista( ){
Recorre=InicioLista;
while(Recorre!=NULL){
cout<<Recorre->DATO<<" ";
Recorre=Recorre->Sig;
}
getch();
}
[B]
void ImprimirListaAlreves( ){
Recorre=FinLista;
while(Recorre!=NULL){
cout<<Recorre->DATO<<" ";
Recorre=Recorre->ant;
}
getch();
}[/B]

int main( ){
int opc, Elemento;
do{
cout<<"1)Insertar\n";
cout<<"2)ImprimirLista\n"; 
[B]cout<<"3)ImprimirLista Al reves\n";
cout<<"4)Salir\n"; [/B]
cout<<"Opcion : "; 
cin>>opc;

if (opc==1){
cout<<"Elemento";
cin>>Elemento;
InsertaNodo(Elemento);
}
else if (opc==2){
cout<<"Elemento de la lista .... \n";
ImprimirLista( );
}
[B]else if (opc==3){
cout<<"Elemento de la lista .... \n";
ImprimirListaAlreves();
}
} while(opc!=4);[/B]

}

Bueno espero que se alcancen a apreciar los cambios que puse en negrita.

Y un comentario antes de que me cuelguen los que ponen en letras GRANDES y remarcado "Aqui no hacemos la tarea a NADIE", el programa original tiene errores, los corregi, agregue la solución, la probe y regrese los errores, digo la pregunta es como hacer el doble recorrido no que errores tiene mi programa :memeo:.

Sin animo de ofender y/o provocar una discusión me gustaria ver la solución que propone con una lista simple enlazada, digo siempre se aprende algo nuevo.

P.D. no me pude aguantar las ganas de omitir este ultimo comentario pero es faScinantes no faCinantes, es profeSionalmente no profeCionalmente y por ultimo y no por eso que no haya mas errores pero ya me da flojera seguir escribiendo es ocaSionado no ocaCionado. :aplausos:
 
Disculpa

Despues de leer el post de angel79, lei el mio anterior y entiendo la racción, sueno muy grosero; "no era mi intención". Solo que no tolero que ultimamente los foros de programación han sido puras acucaciones más que ayuda; nadie puede ofrecer o perdir algo porque ya lo estan acusando de que "Quiere que le hagan la tarea" y la verdad para los que van comenzando eso desalienta. Además para mi impresión muchas de esas respuestas no son mas que la forma disfrazada de decir: "Tampoco se como hacerlo pero si me quejo de tí hago creer a los demás de que sé más que tu".

Ahora edito mi post para quitar esa parte que pueda ofender; mientras que por las faltas de ortografía no me molestan, por lo menos estoy conciente de que fueron involuntarias y por menso y no por moda de metroflog o facebook.

Una disculpa angel79 y cualquier otro que pude haber ofendido sin desearlo.:abacho:
---------------
Una cosa más, claro que para lo que quiere hacer es mas sencillo con listas doblemente ligadas pero si yo fuera su maestro de ED no dejaria que se saltara de tema hasta que dominara el actual, es decir si estan viendo listas simplemente ligadas todos los algoritmos que pediría serian de este tipo de dato abstracto, aun cuando otro sea mejor.
 
No amigo no me siento ofendido, pero yo pienso que este tipo de sitios es hecho por gente que venimos en busca de ayuda y gente que tenga ganas de ayudar (como el mismisimo webmaster). A lo mejor las respuestas no es exactamente lo que buscas pero con el simple hecho de hacer el intento de ayudar es algo que se agradece.

Sin ir mas lejos existe una técnica de trabajo que se llama lluvia de ideas, donde un grupo de personas buscando una solución hace aportaciones segun su experiencia, su forma de ver las cosas, etc.. a lo mejor hay quien diga cosas por decirlas (tonterias) pero con la conjunción de las aportaciones todos llegan a una solución.

La vdd si me parecio muy prepotente tu anterior respuesta, dando a entender: "no les hagas caso que no saben lo que dicen". :llorar:

Pero aclarado el modo, que bueno que existan lugares donde saquemos nuestras frustraciones jajajajaja :memeo:

Con respecto al tema de hacer la tarea o no hacer la tarea de alguien, yo creo que el que viene a buscar una respuesta a su falta de ganas, desinteres o lo que sea que lo motive a buscar un camino fácil a algo que tiene que hacer por el mismo al final el único perjudicado es el. Porque?, porque nunca va a aprender y cuando termine sus estudios (si es el caso) y por azares del destino se quiera dedicar a algo que nunca aprendió bien le va a sufrir, porque ya en el trabajo es de que a fuerza lo tienes que hacer o simplemente prescinden de tus servicios, así de sencillo.

Además imaginate que todos salieramos de la escuela siendo unos buenazos en la programación, estaría re-canija la competencia no? jajajaja
 
Gracias cdar ahora ya entiendo mas d e estas cosas, muchas gracias por la explicada me ha servido ahora me dispongo a programar,
 
sale ya quedo , ya me salio muchas gracias por la ayuda de todos me sirvio lo de tu post angel79 gracias a todos
 
Volver
Arriba