Dev - C++ - Lista doblemente enlazada

 
Vista:
Imágen de perfil de Sarah

Lista doblemente enlazada

Publicado por Sarah (29 intervenciones) el 14/05/2022 05:39:11
Hola, necesito ayuda, estoy empezando con listas y necesito algunos ejemplos de listas doblemente enlazadas, puede ser sencillo, es para poder apreciar mejor su estructura. Gracias
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
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Lista doblemente enlazada

Publicado por Alfil (1444 intervenciones) el 14/05/2022 08:45:46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <cctype>
 
using namespace std;
 
const int ASCENDENTE = 1;
const int DESCENDENTE = 0;
 
struct Personal {
    string nombre;
    string direccion;
    int telefono;
    string correo;
};
 
typedef struct Nodo {
    Personal datos;
    struct Nodo *siguiente;
    struct Nodo *anterior;
} tipoNodo;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
 
 
void Insertar(Lista *l, Personal v);
void BorrarLista(Lista *);
void MostrarLista(Lista l, int orden);
 
int main() {
 
    Personal v;
    Lista lista = NULL;
    pNodo p;
 
    char c;
    do {
        cout << "\nNombre: "; getline( cin, v.nombre );
        cout << "Direccion: "; getline( cin, v.direccion );
        cout << "Telefono: "; cin >> v.telefono;
        cin.ignore();
        cout << "Correo: "; getline( cin, v.correo );
 
        Insertar(&lista, v);
 
        cout << "\nInsertar mas datos (S/n): "; cin >> c;
        cin.ignore();
        c = toupper( c );
 
    }while( c == 'S');
 
    MostrarLista(lista, ASCENDENTE);
    MostrarLista(lista, DESCENDENTE);
 
    BorrarLista(&lista);
 
   return 0;
}
 
void Insertar(Lista *lista, Personal v) {
   pNodo nuevo, actual;
 
   nuevo = new Nodo;
   nuevo->datos.nombre = v.nombre;
   nuevo->datos.direccion = v.direccion;
   nuevo->datos.telefono = v.telefono;
   nuevo->datos.correo = v.correo;
 
   actual = *lista;
   if(actual) while(actual->anterior) actual = actual->anterior;
 
   if(!actual || actual->datos.nombre > v.nombre) {
      nuevo->siguiente = actual;
      nuevo->anterior = NULL;
      if(actual) actual->anterior = nuevo;
      if(!*lista) *lista = nuevo;
   }
   else {
      while(actual->siguiente &&actual->siguiente->datos.nombre <= v.nombre)
         actual = actual->siguiente;
 
      nuevo->siguiente = actual->siguiente;
      actual->siguiente = nuevo;
      nuevo->anterior = actual;
      if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
   }
}
 
void BorrarLista(Lista *lista) {
   pNodo nodo, actual;
 
   actual = *lista;
   while(actual->anterior) actual = actual->anterior;
 
   while(actual) {
      nodo = actual;
      actual = actual->siguiente;
      delete(nodo);
   }
   *lista = NULL;
}
 
void MostrarLista(Lista lista, int orden) {
   pNodo nodo = lista;
 
   if(!lista) cout << "\nLista vacía";
 
   nodo = lista;
   if(orden == ASCENDENTE) {
      while(nodo->anterior) nodo = nodo->anterior;
      cout << "\nOrden ascendente: ";
      cout << "\n";
      while(nodo) {
         cout << nodo->datos.nombre << " "
              << nodo->datos.direccion << " "
              << nodo->datos.telefono << " "
              << nodo->datos.correo << "\n";
 
         nodo = nodo->siguiente;
      }
   }
   else {
      while(nodo->siguiente) nodo = nodo->siguiente;
      cout << "\nOrden descendente: ";
      cout << "\n";
      while(nodo) {
         cout << nodo->datos.nombre << " "
              << nodo->datos.direccion << " "
              << nodo->datos.telefono << " "
              << nodo->datos.correo << "\n";
 
         nodo = nodo->anterior;
      }
   }
 
   cout << endl;
}
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

Lista doblemente enlazada

Publicado por santiago_paez227 (1 intervención) el 31/10/2022 18:26:54
#include<iostream>
#include<conio.h>
using namespace std;

//incio estructuras
struct lista
{
int info;
struct lista *sig,*ant;

}*cab=NULL, *aux=NULL, *p=NULL, *fd=NULL, *qd=NULL;
void insertar();
void Mostrar_sig();
void Mostrar_ant();
void Eliminar_sig();
void Eliminar_ant();
void Eliminar_act();

int main()
{
char opc;
do
{
cout<<"\t\tLista Doble Circular\n";
cout<<"\t 1. insertar \n";
cout<<"\t 2. Mostrar sig\n";
cout<<"\t 3. Mostar ant \n";
cout<<"\t 4. eliminar sig\n";
cout<<"\t 5. eliminar ant\n";
cout<<"\t 6. eliminar act\n";
cout<<"seleccione la operacion: ";
cin>>opc;

switch(opc)
{
case '1': cout<<"\t1. MODULO INSERTAR \n";
insertar();
break;
case '2': cout<<"\t2. MOSTRAR SIGUIENTE \n";
Mostrar_sig();
break;
case '3': cout<<"\t3. MOSTRAR ANTERIOR \n";
Mostrar_ant();
break;
case '4': cout<<"\t4. MODULO ELIMINAR SIG\n";
Eliminar_sig();
break;
case '5': cout<<"\t4. MODULO ELIMINAR ANT\n";
Eliminar_ant();
break;
case '6': cout<<"\t4. MODULO ELIMINAR ACT\n";
Eliminar_act();
break;
default : cout<<"****OPCION NO EXISTE****"<<endl;
break;
}//fin switch
}while(opc!=6);
return 0;
}//fin main

//funciones
void insertar()
{
aux=(struct lista *)malloc(sizeof(struct lista));
p=cab;
cout<<"ingrese un numero: ";
cin>>aux->info;
aux->sig=cab;
aux->ant=cab;
// aux->act=cab;

//si es el primer nodo

if(cab==NULL)
{
cab=aux;
p=aux;
}//fin if

else
{
while(p->sig!=cab)
{
p=p->sig;
}//fin while
}

//lista circular

p->sig=aux;
aux->ant=p;
cab->ant=aux;

}//fin insertar

void Mostrar_sig()
{
if(cab==NULL)
{
cout<<"no existen registros almacenados"<<endl;
getch();
}//fin if
aux=cab;
cout<<"Recorriendo la lista...."<<endl;
while(aux->sig!=cab)
{
cout<<aux->info <<" ";
aux=aux->sig;
}//fin while

if(aux->sig==cab)
{
cout<<aux->info <<" ";
}//fin if
getch();
}//fin mostrar sig

void Mostrar_ant()
{
if(cab==NULL)
{
cout<<"no existen registros almacenados"<<endl;
getch();
}//fin if
aux=cab->ant;
cout<<"Recorriendo la lista...."<<endl;
do
{
cout<<aux->info <<" ";
aux=aux->ant;
}while(aux->sig!=cab);
getch();
}//fin mostrar ant

//funcion eliminar sig

void Eliminar_sig()
{
int x;
cout<<"Dato siguiente a eliminar.....: ";
cin>>x;

fd=cab;
qd=cab;

while(fd->info !=x && fd->sig!=cab)
{
fd=fd->sig; //salta al siguiente nodo
}//fin while

qd=fd->sig;

if(fd->sig==cab && fd->info==x)
{
cout<<"Es la cabeza, no se puede eliminar"<<endl;
}//fin if
else
{
if(fd->sig==cab && fd->info!=x)
{
cout<<"El numero buscado no existe en la lista"<<endl;
}//fin if
else
{
fd->sig=qd->sig;
(qd->sig)->ant=fd;
cout<<"El dato ha sido eliminado :)\n"<<qd->info;
delete qd;
}
}//fin else
}//fin funcion

//funcion eliminar anterior
void Eliminar_ant()
{
int x;
cout<<"Dato anterior a eliminar.....: ";
cin>>x;

fd=cab;
qd=cab;

while(fd->info!=x)
{
fd=fd->ant;
}//fin while
qd=fd->ant;
if(fd==cab)
{
cout<<"Es la cabeza, no se puede eliminar"<<endl;
}//fin if
else
{
if(qd==cab)
{
cab=cab->sig;
fd->ant=qd->ant;
(fd->ant)->sig=fd;
cout<<"El dato ha sido eliminado :)\n"<<qd->info;
delete qd;
}//fin if
else
{
fd->ant=qd->ant;
(qd->ant)->sig=fd;
cout<<"El dato ha sido eliminado :)\n"<<qd->info;
delete qd;
}//fin else
}//fin else
}//fin funcion eli ant
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