Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

Estas en el tema de Ordenamiento con punteros a estructura en c , ordenamiento burbujeo. en el foro de C/C++ en Foros del Web. Hola, buenas tardes. Soy nueva en el foro. En fin, tengo un problema intentando ordenar alfabeticamente un campo de una estructura. Para ordenar numeros utilizo ...
  #1 (permalink)  
Antiguo 15/02/2015, 14:04
Avatar de ElenaJuarez  
Fecha de Ingreso: febrero-2015
Ubicación: Buenos Aires
Mensajes: 8
Antigüedad: 9 años, 2 meses
Puntos: 0
Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

Hola, buenas tardes. Soy nueva en el foro. En fin, tengo un problema intentando ordenar alfabeticamente un campo de una estructura. Para ordenar numeros utilizo una manera y quería hacer lo mismo para strings. Para ordenar numeros ejemplo edades realizo lo siguiente:

Código C:
Ver original
  1. struct BD *p,aux;
  2. int i,j;
  3. for(p=v,i=0;i<l;i++){
  4. for(j=0;j<l-1-i;){
  5.  
  6. if((p+j)->edad>(p+j+1)){
  7. aux=*(p+j);
  8. *(p+j)=*(p+j+1);
  9. *(p+j+1)=aux;
  10. }
  11.  
  12. }}
Entonces quise hacer lo mismo pero modificando algunas cositas:

Código C:
Ver original
  1. for(p=v,i=0;i<l;i++){
  2. for(j=0;j<l-1-i;){
  3.  
  4. if (strcmp((p+j)->nom,(p+j+1)->nom)>0){
  5.  
  6. strcpy(aux,*(p+j));
  7. strcpy(*(p+j),*(p+j+1));
  8. strcpy(*(p+j+1),aux);
  9. }
  10. }}

Y obviamente no funciona. Cualquier idea es bienvenida. Gracias!!

Última edición por razpeitia; 15/02/2015 a las 21:04
  #2 (permalink)  
Antiguo 15/02/2015, 15:25
 
Fecha de Ingreso: enero-2015
Mensajes: 14
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

strcmp no se usa si queremos comparar solo un caracter, en este caso basta comparar si una letra es mayor que otra, para eso tienes que tener en cuenta que las letras de a A-Z son menores que de a-z.

ejemplo:

cout << ('A' < 'B'? "Si": "No");

luego el ordenamiento, vere si lo encuentro, o si no veo como se hacia xD

Saludos
  #3 (permalink)  
Antiguo 15/02/2015, 15:54
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

Rufux Se trata de C. Viene especificado en el texto.

ElenaJuarez : Bienvenida al foro.

No se muy bien lo que quieres pero creo que es esto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAX_NOMBRES 100
  5. #define MAX_LETRAS  25
  6.  
  7.  
  8. struct BD{
  9.     char nombre[MAX_NOMBRES][MAX_LETRAS]; //100 nombres de maximo 24 caracteres( No ocupar el ultimo ;) )
  10. };
  11.  
  12. int main (){
  13.     int i, j;
  14.     struct BD *p, datos;
  15.     int temp = 0;
  16.     p = &datos;
  17.     //100 nombres de no mas de 24 caracteres. La usaremos para no estar rellenando a mano XD
  18.     char arreglo[MAX_NOMBRES][MAX_LETRAS] = {
  19.         "Karla"            , "Reyna"        , "Ana"            , "Gina"        , "Georgina"    ,  //linea1
  20.         "Joan"            , "Mario"        , "Enrique"        , "Maria"        , "Margo"        ,
  21.         "Lupe"            , "Guadalupe"    , "Erika"        , "Marcuz"        , "Raquel"        ,
  22.         "Leticia"        , "Carlos"        , "Luz"            , "Elena"        , "Pablo"        ,
  23.         "Jose"            , "Juan"        , "Pedro"        , "Xochil"        , "Pepe"        ,
  24.         "Kiju"            , "Rebeca"        , "Rodrigo"        , "Raul"        , "Adile"        ,
  25.         "Janeth"        , "Daniel"        , "Dante"        ,"Eduardo"        , "Emmanuel"    ,
  26.         "Esther"        , "Francia"        , "Federico"    , "Federica"    , "Fausto"        ,
  27.         "Gabriel"        , "Gustavo"        , "German"        , "Hugo"        , "Israel"        ,    
  28.         "Isabel"        , "Irma"        , "Lucia"        , "Lucy"        , "Luz"            ,
  29.         "Luis"            , "Luisa"        , "Lucrecia"    , "Marcos"        , "Manuel"        ,
  30.         "Manuela"        , "Mayla"        , "Nayla"        , "Teodoro"        , "Teofilo"        ,
  31.         "Teofilito"        , "Argenis"        , "Delia"        , "Jesus"        , "Jim"            ,
  32.         "Reyna"            , "Marce"        , "Paco"        , "Francisco"    , "Javier"        ,
  33.         "Xavier"        , "Johan"        , "Joana"        , "Johana"        , "Lourdes"        ,
  34.         "Rebeca"        , "Nathasa"        , "Elizabeth"    , "Miriam"        , "Yuri"        ,
  35.         "Dum"            , "Victor"        , "Victoria"    , "Marta"        , "Martin"        ,
  36.         "Mateo"            , "Matias"        , "Monica"        , "Moises"        , "Mirta"        ,
  37.         "Eloy"            , "Elsa"        , "Emilia"        , "Estela"        , "Querubin"    ,
  38.         "Casimiro"        , "Catalina"    , "Calletano"    , "Ignacio"        , "Zazaza"           //linea20
  39.     };
  40.  
  41.     //cargamos los nombres a la estructura de forma desordenada desde el puntero y lo imprimimos.
  42.     for ( i = 0; i < MAX_NOMBRES; i++ ) {
  43.         strcpy ( &(p->nombre[i][0]), arreglo[i]);
  44.         printf ( "\n %d \t%s", i+1, p->nombre[i] );
  45.     }
  46.    
  47.    
  48.     //Ordenamos los nombres
  49.     printf("\n\nOrdenando...\n\n");
  50.     for ( i = 0; i < MAX_NOMBRES; i++ ){
  51.         for ( j = 0; j < MAX_NOMBRES; j++ ) {
  52.             temp = strcmp ( &p->nombre[j][0], &p->nombre[j + 1][0] );
  53.            
  54.             if ( temp > 0 ) {
  55.                 strcpy ( p->nombre[0], p->nombre[j] );
  56.                 strcpy ( p->nombre[j], p->nombre[j + 1] );
  57.                 strcpy ( p->nombre[j + 1], p->nombre[0] );
  58.             }
  59.         }
  60.     }
  61.  
  62.     //volvemos a imprimir ordenados.
  63.     for ( i = 0; i < MAX_NOMBRES; i++ ) {
  64.         printf ( "\n %d \t%s", i + 1, p->nombre[i] );
  65.     }
  66.  
  67.     getchar();
  68.     return 0;
  69. }

Cuando tengas que hacer: *(puntero).nombre puedes hacerlo p->nombre"Es lo mismo" pero mas fácil.

En la estructura tengo 100 nombres de 25 letras cada. Nunca usamos la ultima en el caso de ser char.
luego creo un objeto de la estructura y hago que p apunte a ese objeto.

Luego de tener el puntero afinado le cargo los 100 nombres del arreglo para no tener que estar llenando nada a mano XD

Luego se ordena de forma parecida a la que comentas y luego después imprimimos el resultado.

No se si es esto lo que quieres... Espero que sirva

Suerte.
  #4 (permalink)  
Antiguo 15/02/2015, 16:11
 
Fecha de Ingreso: enero-2015
Mensajes: 14
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

Gracias vangodp, me olvide que programo en C pero con compilador de C++ xD

:::EDITADO::
Me acabo de dar cuenta que no lei bien xD, confundí ordenar letras de una cadena, con ordenar lista dinamica alfabeticamente, bueno si te sirve ya lo tienes xD

De todas formas hice una función de ejemplo del ordenamiento a burbuja con un solo ciclo (creo que es compatible tambien con C, es la siguiente:

Código C++:
Ver original
  1. typedef struct nodo{
  2.     char nombre[100];
  3.     struct nodo *next;
  4. }Nodo;
  5.  
  6. typedef Nodo *ListaNombres;
  7.  
  8. void order(ListaNombres *lista){
  9.    
  10.     ListaNombres antes = NULL, ahora, despues, siguiente, temp;
  11.    
  12.     ahora = *lista;
  13.     despues = ahora->next;
  14.    
  15.     while (despues) {
  16.        
  17.         if(despues->nombre[0] < ahora->nombre[0]){
  18.            
  19.             siguiente = despues->next;
  20.            
  21.             if(antes != NULL)
  22.                 antes->next = despues;
  23.            
  24.             despues->next = ahora;
  25.             ahora->next =  siguiente;
  26.            
  27.             //intercambiamos ahora y despues para continuar el ciclo
  28.             temp = despues;
  29.             despues = ahora;
  30.             ahora = temp;
  31.            
  32.         }
  33.        
  34.         antes = ahora;
  35.         ahora = ahora->next;
  36.         despues = despues->next;
  37.     }
  38. }

Bueno lo probe, funciona (me hiciste repase un poco xD), lo que hace es recibir el puntero a una lista, luego use 5 punteros (puedes usar 4) y son:
antes - el puntero al nodo anterior, es diferente de null despues de el primer ciclo
ahora - seria el puntero al primer nodo seleccionado de la lista
despues - seria el puntero al nodo que le sigue al de "ahora"
siguiente - seria el puntero al nodo que le sigue a "despues" (sirve solo para guardar el la dirección del siguiente nodo, así no lo borramos mientras se hace el cambio, se podria usar solo temp)
temp - seria un puntero temporaneo que sirve para guardar la direccion antes de sustituir "ahora" con "despues" (porque no puedes hacer "ahora" = "despues" y "despues" = "ahora", sin perder la dirección de ahora)

bueno el ciclo termina cuando despues es igual a null, dentro del ciclo comparo los primeros caracteres de los nombres, para ordenarlos de menor a mayor (de A a z)

luego intercambio los nodos, hice un dibujo para mostrarlo xD

http://imgur.com/EhFQ50x

Bueno espero que te sirva de ayuda, saludos

Última edición por Rufux; 15/02/2015 a las 16:19
  #5 (permalink)  
Antiguo 16/02/2015, 22:11
Avatar de ElenaJuarez  
Fecha de Ingreso: febrero-2015
Ubicación: Buenos Aires
Mensajes: 8
Antigüedad: 9 años, 2 meses
Puntos: 0
Sonrisa Respuesta: Ordenamiento con punteros a estructura en c , ordenamiento burbujeo.

Muchas gracias a los dos, me sirvieron las dos respuestas!! Estoy estudiando para un final y la verdad que hasta cosas que no vi en clase me pongo a hacer!! muchas gracias por sacarme las dudas!!

Etiquetas: estructuras, ordenamiento, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:51.