Programación General > C/C++

 Duda, Lista Circular

(1/1)

ANDREYU:
Hola, como estan todos, soy nuevo en ete foro, estoy llevando un curso de univesidad en el que usamos c++, mi pregunta es:

mi profesor nos puso una tarea de hacer una lista, cola, pila o arbol, circular, parecido a una agenda de telefono, donde se agreguen contactos y se puedan ver uno por uno, y que uno pueda poner siguienente y atras.

ya tengo hecho la estructura y puedo ver cada nodo uno por uno, pero no se como conectar el ultimo nodo al primero y el primero al ultimo.

creo que he podido conectarlos, pero tuve que quitar el while para mostrarlos y solo me muestra el primer nodo y el ultimo ingresado.

les agradesco su ayuda y tiempo, gracias.

este es el codigo que he hecho.


--- Código: C++ ---#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <iostream.h> struct agenda {        char nombre[40];        char apellido[40];        char telefono[40];         struct agenda *siguiente;        struct agenda *anterior;};agenda *actual=NULL;agenda *ultimo;agenda *inicio;agenda *fin; int main(){int opcion; do{clrscr(); cout<<"\t AGENDA\n";cout<<"\n Seleccione Acci¢n\n";cout<<"\n 1.-Ingresar Contacto\n";cout<<"\n 2.-Mostrar Agenda\n";cout<<"\n 3.-Salir\n";cout<<"\nOpcion: ";scanf("%d",&opcion);getchar(); if(opcion>=4){clrscr();printf("Opcion Incorrecta");getch();}else{switch (opcion) { case 1 :clrscr(); char tempnombre[40],tempapellido[40],temptelefono[40]; printf("\tINGRESAR\n");cout<<"\nDigite Nombre: ";scanf("%s",tempnombre);cout<<"\nDigite Apellido: ";scanf("%s",tempapellido);cout<<"\nDigite Telefono: ";scanf("%s",temptelefono); clrscr();if(actual==NULL){        actual=new agenda;        actual->siguiente=actual->anterior=NULL;        strcpy(actual->nombre,tempnombre);        strcpy(actual->apellido,tempapellido);        strcpy(actual->telefono,temptelefono);}else {        agenda *ultimo=actual;         while((ultimo->siguiente!=NULL)&&(strcmp(ultimo->nombre,tempnombre)!=0))        {                ultimo=ultimo->siguiente;        }        if(strcmp(ultimo->nombre,tempnombre)==0)        {                strcpy(ultimo->nombre,tempnombre);        }        else        {                ultimo->siguiente=new agenda;                ultimo->siguiente->siguiente=NULL;                ultimo->siguiente->anterior=ultimo;                ultimo=ultimo->siguiente;                strcpy(ultimo->nombre,tempnombre);                strcpy(ultimo->apellido,tempapellido);                strcpy(ultimo->telefono,temptelefono);        }                cout<<"\n\n"; }//finaliza elsebreak; case 2 :int opcion1; clrscr();printf("\tContactos\n\n"); if(actual==NULL){cout<<"La Lista esta Vacia";}else{        agenda *actuall=actual;                 cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";                cout<<"Telefono: "<<actuall->telefono<<"\n";                printf("\n");do{ cout<<"\n 1.-Atras    ";cout<<"2.-Siguiente    ";cout<<"3.-Salir   ";cout<<"      ";scanf("%d",&opcion1);cout<<"\n"; switch (opcion1){case 1 :{actuall=actuall->anterior;cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 2 :{actuall=actuall->siguiente;cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 3 :{printf("Saliendo");opcion1=3;}break;}//fin del swith}//fin del dowhile(opcion1!=3);}clrscr();break; case 3 :{clrscr();printf("Fin del Programa");opcion=3;getch();}break; }//fin de switch}//fin del else}//fin de dowhile(opcion!=3);return(0);}//fin del main 

herzdark:
vos lo q estas usando es una lista doblememente enlazada circular no?, entonces ya cuando el nodo es NULL yo podría así:


--- Código: C ---  if(actual==NULL)    {actual=new agenda;      actual->siguiente=actual->anterior=actual; //ahi estaria logrando q el nodo sig y ant se apunte a si mismo (o mejor dicho      strcpy(actual->nombre,tempnombre); //lo q llamamos circular)      strcpy(actual->apellido,tempapellido);      strcpy(actual->telefono,temptelefono);    } 
después con el tema de saber el principio y final no se si tu puntero de inicio de lista esta al primer nodo, al ultimo nodo insertado (creo q con este serie medio complicado saber el inicio y final) y ultimo nodo, si usas p/e el primer nodo vos ya tenes tu inicio y final entonces lo unirias así:


--- Código: C ---fin->siguiente=inicio;inicio->anterior= fin; 
espero q esto te sirve igualmente hacete el dibujo así me salio a mi

ANDREYU:
Gracias por la Respuesta, lo siento por responder tarde, pero he tenido muchos trabajos, dejo el codigo de la lista doblemente enlazada circular como quedo si a alguien le sirve despues.


--- Código: C++ ---#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <iostream.h> struct agenda {        char nombre[40];        char apellido[40];        char telefono[40];         struct agenda *siguiente;        struct agenda *anterior;};agenda *actual=NULL;agenda *ultimo;agenda *inicio;agenda *fin; int main(){ int opcion; do{clrscr(); cout<<"\t AGENDA\n";cout<<"\n Seleccione Acci¢n\n";cout<<"\n 1.-Ingresar Contacto\n";cout<<"\n 2.-Mostrar Agenda\n";cout<<"\n 3.-Salir\n";cout<<"\nOpcion: ";scanf("%d",&opcion);getchar(); if(opcion>=4){clrscr();printf("Opcion Incorrecta");getch();}else{switch (opcion) { case 1 :clrscr(); char tempnombre[40],tempapellido[40],temptelefono[40]; printf("\tINGRESAR\n");cout<<"\nDigite Nombre: ";scanf("%s",tempnombre);cout<<"\nDigite Apellido: ";scanf("%s",tempapellido);cout<<"\nDigite Telefono: ";scanf("%s",temptelefono); clrscr();if(actual==NULL){        actual=new agenda;        inicio=actual;        actual->siguiente=inicio;        actual->anterior=inicio;        strcpy(actual->nombre,tempnombre);        strcpy(actual->apellido,tempapellido);        strcpy(actual->telefono,temptelefono);        fin=actual->siguiente;}else {        agenda *ultimo=actual;                 while((ultimo->siguiente!=fin)&&(strcmp(ultimo->nombre,tempnombre)!=0))        {                ultimo=ultimo->siguiente;        }        if(strcmp(ultimo->nombre,tempnombre)==0)        {                strcpy(ultimo->nombre,tempnombre);        }         else        {                ultimo->siguiente=new agenda;                ultimo->siguiente->siguiente=inicio;                ultimo->siguiente->anterior=ultimo;                ultimo=ultimo->siguiente;                strcpy(ultimo->nombre,tempnombre);                strcpy(ultimo->apellido,tempapellido);                strcpy(ultimo->telefono,temptelefono);                fin=ultimo->siguiente;                actual->anterior=ultimo;        }                cout<<"\n\n"; }//finaliza elsebreak; case 2 :int opcion1; clrscr();printf("\tContactos\n\n"); if(actual==NULL){cout<<"La Lista de Contactos esta Vacia";getch();}else{        agenda *actuall=actual;                 cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";                cout<<"Telefono: "<<actuall->telefono<<"\n";                printf("\n"); do{ cout<<"\n 1.-Atras    ";cout<<"2.-Siguiente    ";cout<<"3.-Salir   ";cout<<"      ";scanf("%d",&opcion1);cout<<"\n"; switch (opcion1){case 1 :{actuall=actuall->anterior;cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 2 :{actuall=actuall->siguiente;cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; }//fin del swith}//fin del dowhile(opcion1!=3);}clrscr();break; case 3 :{clrscr();printf("Fin del Programa");opcion=3;getch();}break; }//fin de switch}//fin del else}//fin de dowhile(opcion!=3);return(0);}//fin del main

Navegación

[0] Índice de Mensajes

Ir a la versión completa