Sábado 14 de Diciembre de 2024, 17:41
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Duda, Lista Circular
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Duda, Lista Circular (Leído 2086 veces)
ANDREYU
Nuevo Miembro
Mensajes: 3
Duda, Lista Circular
«
en:
Domingo 27 de Noviembre de 2011, 18:37 »
0
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
<<
"
\n
Opcion: "
;
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
(
"
\t
INGRESAR
\n
"
)
;
cout
<<
"
\n
Digite Nombre: "
;
scanf
(
"%s"
,tempnombre
)
;
cout
<<
"
\n
Digite Apellido: "
;
scanf
(
"%s"
,tempapellido
)
;
cout
<<
"
\n
Digite 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 else
break
;
case
2
:
int
opcion1
;
clrscr
(
)
;
printf
(
"
\t
Contactos
\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 do
while
(
opcion1
!
=
3
)
;
}
clrscr
(
)
;
break
;
case
3
:
{
clrscr
(
)
;
printf
(
"Fin del Programa"
)
;
opcion
=
3
;
getch
(
)
;
}
break
;
}
//fin de switch
}
//fin del else
}
//fin de do
while
(
opcion
!
=
3
)
;
return
(
0
)
;
}
//fin del main
Tweet
«
última modificación: Domingo 27 de Noviembre de 2011, 18:54 por ANDREYU
»
herzdark
Miembro activo
Mensajes: 38
Nacionalidad:
Re:Duda, Lista Circular
«
Respuesta #1 en:
Jueves 1 de Diciembre de 2011, 00:02 »
0
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
Nuevo Miembro
Mensajes: 3
Re:Duda, Lista Circular
«
Respuesta #2 en:
Martes 20 de Diciembre de 2011, 20:37 »
0
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
<<
"
\n
Opcion: "
;
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
(
"
\t
INGRESAR
\n
"
)
;
cout
<<
"
\n
Digite Nombre: "
;
scanf
(
"%s"
,tempnombre
)
;
cout
<<
"
\n
Digite Apellido: "
;
scanf
(
"%s"
,tempapellido
)
;
cout
<<
"
\n
Digite 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 else
break
;
case
2
:
int
opcion1
;
clrscr
(
)
;
printf
(
"
\t
Contactos
\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 do
while
(
opcion1
!
=
3
)
;
}
clrscr
(
)
;
break
;
case
3
:
{
clrscr
(
)
;
printf
(
"Fin del Programa"
)
;
opcion
=
3
;
getch
(
)
;
}
break
;
}
//fin de switch
}
//fin del else
}
//fin de do
while
(
opcion
!
=
3
)
;
return
(
0
)
;
}
//fin del main
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Duda, Lista Circular