elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ordenar lista simplemente enlazada en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar lista simplemente enlazada en lenguaje C.  (Leído 17,625 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Ordenar lista simplemente enlazada en lenguaje C.
« en: 5 Julio 2016, 02:50 am »

Hola, que tengas un muy buen día.



En primer lugar, les consulto si la imagen refleja lo que es un nodo, sin tener en cuenta las direcciones de memoria que no necesariamente son continuas como un vector. -
Y la otra duda es, como debo hacer para que la lista quede ordenada. -
Les pediría un pequeño favor mas, si es posible me ayuden con pseudocódigo quiero encarar la solución por mí mismo, luego si se me queman los papeles les pediré algo de código. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. struct _agenda{
  6. int dato;
  7. struct _agenda *siguiente;
  8. };
  9.  
  10. struct _agenda *primero, *ultimo;
  11.  
  12. void mostrar_menu();
  13. void agregar_elemento();
  14. void mostrar_lista();
  15.  
  16. int main(void){
  17. char opcion, ch;
  18.  
  19. primero = (struct _agenda *) NULL;
  20. ultimo = (struct _agenda *) NULL;
  21. do{
  22. mostrar_menu();
  23. opcion = getchar();
  24. while((ch = getchar()) != EOF && ch != '\n');
  25. switch ( opcion ){
  26. case '1': agregar_elemento();
  27. break;
  28. case '2':  printf("No disponible todavía!\n");
  29. break;
  30. case '3': mostrar_lista(primero);
  31. break;
  32. case '4': exit( 1 );
  33. default: printf( "Opción no válida\n" );
  34. printf( "\n Pulse una tecla para continuar..." ); getchar();
  35. break;
  36. }
  37. } while (opcion!='4');    
  38.  
  39. return 0;
  40. }
  41.  
  42.  
  43. void mostrar_menu(){
  44. system( "clear" );
  45. printf( "\n\n ===== Menu =====" );
  46. printf( "\n\n 1 - Agregar elemento" );
  47. printf( "\n 2 - Borrar elemento" );
  48. printf( "\n 3 - Mostrar elementos" );
  49. printf( "\n 4 - Salir" );
  50.  
  51. printf("\n\n Escoge una opcion......: ");
  52. }
  53.  
  54. void agregar_elemento(){
  55. struct _agenda *nuevo;
  56. int ch;
  57.  
  58. nuevo = (struct _agenda *) malloc (sizeof(struct _agenda));
  59. if( nuevo == NULL){
  60. printf(" \n No hay memoria disponible");
  61. }
  62. printf( "\n ===== Nuevo elemento =====" );
  63. printf( "\n Dato.....:" );
  64. scanf( "%d", &nuevo->dato );
  65. while ((ch = getchar()) != EOF && ch != '\n');
  66.  
  67. nuevo->siguiente = NULL;
  68.  
  69. if( primero == NULL ){
  70. printf( "\n Primer elemento" );
  71. primero = nuevo;
  72. ultimo  = nuevo;
  73. }else{
  74. ultimo->siguiente = nuevo;
  75. ultimo = nuevo;
  76. }
  77. }
  78.  
  79.  
  80. void mostrar_lista(){
  81. struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
  82. int i=0;
  83.  
  84. auxiliar = primero;
  85. printf( "\n Mostrando la lista completa:\n ");
  86. while( auxiliar != NULL ){
  87. printf( "\n Dato....: %d", auxiliar->dato);
  88. auxiliar = auxiliar->siguiente;
  89. i++;
  90. }
  91. if( i==0 ){
  92. printf( "\n La lista esta vacia!!\n" );
  93. }
  94. printf( "\n Pulse una tecla para continuar..." ); getchar();
  95. }

 
Saludos.


« Última modificación: 5 Julio 2016, 02:52 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.470


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #1 en: 5 Julio 2016, 03:07 am »

Hola!

La imagen me parece bien. Quizás podrías colocar valores hexa (y más grandes, tipo 0x0001CAFE) a las direcciones donde se encuentran los nodos, pero la idea en gral. la veo bien.

Con respecto al ordenamiento, creo que lo más sencillo de aplicar es ordenación por burbuja.
Te dejo un par de links para que mires cómo es el método:

http://c.conclase.net/orden/?cap=burbuja
https://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #2 en: 5 Julio 2016, 03:09 am »

Si esa imagen es de nodos de lista ligada o colas.

Algoritmo.

Pasar los datos de la lista ligada simple a un arreglo lineal, Tienes que tener una funcion para obtener valores sin eliminarlos.
una vez en arreglo lineal, ordenas con cualquier método de ordenamiento.

Los vuelves a agregar a una nueva lista y eliminas toda la lista vieja.

Saludos.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #3 en: 6 Julio 2016, 00:33 am »

Hola, MCKSys Argentina muchas gracias por tu tiempo, en realidad el método de la burbuja ya lo tenía lo que necesito es la manera para lograr ordenar una lista simplemente enlazada, dejo lo que tengo logrado, lo que ocurre es que no me doy cuenta como transformar el vector estático ordenado en una lista dinámica, les dejo lo que llevo hecho, espero que puedan guiarme con código o alguna idea. -
Alberto, ya sabrás que todo texto que valla dirigido a voz es un agradecimiento.

Código
  1. void ordenar_lista( size_t cont){
  2. struct _agenda *auxiliar; //LsE008
  3. int tmp[cont], aux, i=0, j;
  4. auxiliar = primero;
  5.  
  6. if( cont>1 ){ //LsE009
  7. printf( "\n Mostrando la lista ORDENADA (total %lu):\n ", cont);
  8. while( auxiliar != NULL ){
  9. tmp[i] = auxiliar->dato;
  10. auxiliar = auxiliar->siguiente;
  11. i++;
  12. }
  13.  
  14. //LsE010
  15. for(i=0; i<cont-1; i++) {
  16. for(j=i+1; j<cont; j++) {
  17. if( tmp[i] > tmp[j] ){
  18. aux = tmp[i];
  19. tmp[i] = tmp[j];
  20. tmp[j] = aux;
  21. }
  22. }
  23. }
  24.  
  25. for( i=0; i<cont; i++ ){
  26. printf( "\n %d", tmp[i] );
  27. }
  28. printf( "\n\n Pulse una tecla para continuar..." ); getchar();
  29. }else{
  30. printf( "\n No cuenta con suficientes elementos para ordenar.\n\n"
  31. " Pulse una tecla para continuar..."); getchar();
  32. }
  33. }
  34.  
  35.  
  36.  
  37. /* ================ Ayuda ================
  38.  
  39. LsE001 -> Con esta función añadimos un elemento al final de la lista.
  40. LsE002 -> reservamos memoria para el nuevo elemento.
  41. LsE003 -> El campo siguiente va a ser NULL por ser el último elemento.
  42. LsE004 -> ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista comprobamos
  43.  si la lista está vacía. si primero==NULL es que no hay ningún elemento en la lista.
  44. LsE005 -> El que hasta ahora era el último tiene que apuntar al nuevo.
  45. LsE006 -> Hacemos que el nuevo sea ahora el último.
  46. LsE007 -> Lo usamos para recorrer la lista.
  47. LsE008 -> Lo usamos para recorrer la lista
  48. LsE009 -> Verificamos si hay más de 1 dato para ordenar. de ser asi ponemos los datos
  49.  en un vector.
  50. LsE010 -> Ordenamos el vector.
  51. */
Saludos.
 
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #4 en: 6 Julio 2016, 01:52 am »

Citar
lo que ocurre es que no me doy cuenta como transformar el vector estático ordenado en una lista dinámica


Vas bien aun tengo mi duda con una linea de tu codigo pero eso es otro detalle.

Como comente
Citar
Los vuelves a agregar a una nueva lista y eliminas toda la lista vieja.

Creas una nueva lista, he iteras en el arreglo de principio a fin agregando los nodos a esa nueva lista.

El detalle que veo es que tu funcion para agregar un elemento a la lista solo lo tienes como para agregar datos que vienen desde el teclado. Tienes que tener una funcion a la cual le puedas pasar un argumento o dos (valor a agregar y lista a la que se lo va a agregar.

Y asi creas una nueva lista y destruyes la lista vieja algo como

Código
  1. //Destruir una lista
  2. void destruir_lista(struct _agenda *primero){
  3. struct _agenda *pivote,*auxiliar  =primero;
  4. while( auxiliar != NULL ){
  5. pivote = auxiliar->siguiente;
  6. free(auxiliar);
  7. auxiliar = pivote;
  8. }
  9.  

Por eso si te fijas hago como funciones genericas que puedan procesar cualquier lista.

Te comento que me intriga la siguiente  linea de tu codigo

Código
  1. int tmp[cont];

No te marca error?

Saludos

Se que ya lo viste pero lo dejo aqui para otros usuarios




« Última modificación: 6 Julio 2016, 01:56 am por AlbertoBSD » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #5 en: 6 Julio 2016, 02:26 am »

Ahora me hiciste entrar la duda, ¿no se declara de esa manera un vector de enteros?, el programa funciona de maravillas, sin ninguna advertencia. -

 
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #6 en: 6 Julio 2016, 02:37 am »

Si, pero solo lo habia visto con valores constantes, Y para valores variables solo lo habia visto con memoria dinámica ya sea malloc o con new.

ahora que llegue a la casa lo valido

Saludos
En línea

geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #7 en: 6 Julio 2016, 03:27 am »

Te comento que me intriga la siguiente  linea de tu codigo

Código
  1. int tmp[cont];

No te marca error?

Es una característica que se agregó a partir de C99 pero se volvió opcional en C11, se les denomina array de longitud variable

Mas info:

https://en.m.wikipedia.org/wiki/Variable-length_array

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    size_t n;
  6.  
  7.    printf("Ingresar longitud: ");
  8.    scanf("%d", &n);
  9.  
  10.    int array[n];
  11.  
  12.    for(int i = 0; i < n; i++)
  13.    {
  14. array[i] = i + 1;
  15. printf("%4d ", array[i]);
  16.    }
  17.    return 0;
  18. }
« Última modificación: 6 Julio 2016, 04:11 am por geeke » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #8 en: 6 Julio 2016, 13:08 pm »

Citar
agregó a partir de C99

Gracias por la respuesta y el ejemplo :) De hecho lo habia buscado rapidamente y llegué al siguiente enlace en stackoverflow

http://stackoverflow.com/questions/448844/variable-sized-arrays-vs-calloc-in-c

Donde de igual manera los expertos siguen recomendando otras formas de inicializar.

Aun asi para el ejemplo mostrado y dado que ae trata de una variable temporal y auxiliar dentro de una funcion esta bien usarlo asi.

Ahora aclarado eso solo queda esperar que NOB2014 solucione el detalle de crear una nueva lista ligada con el arreglo mencionando y sustiyendo a la matriz vieja.

Saludos
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ordenar lista simplemente enlazada en lenguaje C.
« Respuesta #9 en: 7 Julio 2016, 21:05 pm »

lo que ocurre es que no me doy cuenta como transformar el vector estático ordenado en una lista dinámica
Si lo que quieres es ordenar la lista que ya tienes, puedes aplicar el algoritmo de burbuja directamente en la lista, sin pasar por un array intermedio. El procedimiento es el mismo, cambiando índices por iteradores (struct _agenda* en tu caso).
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lista Simplemente enlazada ayuda
Programación C/C++
Cpp 1 2,045 Último mensaje 11 Diciembre 2014, 07:29 am
por eferion
Borrar nodo en lista simplemente enlazada[C]
Programación C/C++
NOB2014 4 6,032 Último mensaje 28 Julio 2016, 14:22 pm
por NOB2014
Borrar ultimo nodo lista simplemente enlazada
Programación C/C++
robertoesimez 5 5,279 Último mensaje 23 Marzo 2017, 07:22 am
por MAFUS
Problema con una lista simplemente enlazada en C++
Programación C/C++
Mike_EDD 1 2,810 Último mensaje 4 Septiembre 2017, 22:24 pm
por ivancea96
Modificacion del orden de una lista simplemente enlazada
Programación C/C++
Beginner Web 4 2,393 Último mensaje 3 Septiembre 2018, 01:57 am
por Beginner Web
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines