Dev - C++ - Ordenar por nombre lista doblemente elazada c/c++

 
Vista:
Imágen de perfil de Alejandro

Ordenar por nombre lista doblemente elazada c/c++

Publicado por Alejandro (2 intervenciones) el 29/03/2019 20:42:37
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
/////////////////////ESTRUCTURAS/////////////
struct general{
   string direccion;
   int telefono;
   string correo;
};
 
struct nodo{
    char nombre[50];
    struct general datos;
 
    nodo* sig;
    nodo* atras;
}*primero, *ultimo;
 
//////////////////////////////FUNCION SORT BY NAME////////////////
void ordenar(){
 
	 nodo* aux = new nodo();
	 nodo* p = new nodo();
	 char tmp[50];
 
 
 
   if( primero != NULL){
 
   	p = primero;
 
   	while(p != primero){
 
   		aux = p->sig;
   		while(aux!=primero){
 
   			if(p->nombre  >  aux->nombre){
   				 tmp = p->nombre;
   				 p->nombre = aux->nombre;
   				aux->nombre = tmp;
			   }
 
   			aux=aux->sig;
		   }
	   }
	   p = p->sig;
 
   }else{
   	cout<<"Empty"<<endl;
   }
 
}
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 Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ordenar por nombre lista doblemente elazada c/c++

Publicado por Rodrigo (539 intervenciones) el 30/03/2019 15:10:59
Veo algunos problemas:

En la linea 27 asignas a p con valor primero
En la linea 29 intentas iniciar un ciclo mientras p no sea primero, o sea, no se va a ejecutar nunca, por la linea 27 recien indicada.

Si se llegara a ejecutar, en las lineas siguientes (34 - 38), pareciera que intercambias nombres entre 2 nodos, pero muestras en la linea 9 y 10 que tus nodos tienen mas que el nombre.
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
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++

Ordenar por nombre lista doblemente elazada c/c++

Publicado por Alfil (1444 intervenciones) el 31/03/2019 09:34:11
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