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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 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 ... 37
141  Programación / Programación C/C++ / Documentar función para borrar nodo según petición del usuario en C. en: 15 Julio 2016, 00:26 am
Hola, gente.
como se podrán imaginar aveces hago post que se me ocurren a mí solamente, pero si los hago es porque me resulta de mucha ayuda para aprender en serio y no en distintas ocasiones tener que copiar y pegar. -   
Les dejo la función para que en primer lugar me ayuden a documentarla, yo hice algunas lineas para que la tomen como Ej. para que se entienda lo que necesito. -
Si alguien tiene otra versión y la quiere postear, mi agradecimiento. -

Código
  1. struct lista *eliminarIndice( struct lista *L, int indice){
  2. int i = 1;
  3. if( L != NULL ){ // Verificamos que la lista no este vacia.
  4. if( indice <= 10 && indice > 0){ // Si indice es mayor a cero y menor o igual a la cant. de elemento continuamos.  
  5. struct nodo *anterior = L->primero; // Grabamos en anterior la direc. del primer nodo.
  6. struct nodo *pivote = L->primero; // Y lo mismo con pivote.
  7. while( i < indice ){ // Bucle para....
  8. anterior = pivote;
  9. pivote = pivote->siguiente;
  10. i++;
  11. }
  12. if( pivote->siguiente != NULL ){
  13. if( pivote->siguiente != L->primero ){
  14. anterior->siguiente = pivote->siguiente;
  15. free( pivote );
  16. }else{
  17. L->primero = pivote->siguiente;
  18. free( pivote );
  19. }
  20. }else{
  21. if( pivote != L->primero ){
  22. anterior->siguiente = NULL;
  23. free( pivote );
  24. L->ultimo = anterior;
  25. }else{
  26. free( pivote );
  27. }
  28. }
  29. L->elementos--;
  30. if( L->elementos == 0){
  31. free( L );
  32. return NULL;
  33. }else{
  34. return L;
  35. }
  36. }else{
  37. printf( "\n El indice pedido es mayor que los elementos existentes..." );
  38. return L;
  39. }
  40. }else{
  41. printf( "\n No se puede procesar una lista vacia..." );
  42. return NULL;
  43. }
  44. }

Saludos.
142  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 12 Julio 2016, 19:28 pm
Hola, Alberto. -
Ya cambie la función para que no devuelva ningún valor (void) y funciona de maravilla, también debo agradecerte porque hiciste que me cayera la ficha, ahora si entiendo como funciona. -

Un abrazo.
143  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 12 Julio 2016, 18:48 pm
Hola, buen día. -
Todavía no llegue a leer sobre arboles binarios solo sé que está dentro del capitulo que estoy estudiando, igual ya hice un enlace en mis apuntes para cuando llegue al tema tratar de interpretar tu propuesta. -
La consulta que les voy a efectuar tal vez les resulte infantil, pero créanme que hace más de un día que intento interpretar como funciona pero no hay caso. -
Les pregunto en que lugar de la función ordenar se modifica la estructura nodo, hay 2 punteros a estructura pivote y actual, pero no veo que en ningún lugar se iguale L con el puntero pivote, estoy escribiendo el hilo y regreso a la función para tratar de darme cuenta como funciona pero nada. -     

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct nodo{
  5. int dato;
  6. struct nodo *siguiente;
  7. };
  8.  
  9. struct lista{
  10. struct nodo *primero;
  11. struct nodo *ultimo;
  12. };
  13.  
  14. struct lista *ingresos( struct lista *L );
  15. struct lista *agregar( struct lista *L, int dato );
  16. struct nodo *crear( int dato );
  17. struct lista *ordenar(struct lista *L);
  18. void mostrar(struct lista *L);
  19.  
  20.  
  21. int main( void ){
  22. struct lista *Lista = NULL;
  23.  
  24. Lista = ingresos( Lista );
  25. Lista = ordenar( Lista );
  26. mostrar( Lista );
  27.  
  28. free(Lista);
  29. return 0;
  30. }
  31.  
  32. struct lista *ingresos( struct lista *L ){
  33. int i;
  34.  
  35. for( i=8; i>0; i-- ){
  36. printf( "\n %d", i );
  37. L = agregar( L, i );
  38. }
  39.  
  40. return L;
  41. }
  42.  
  43.  
  44. struct lista *agregar( struct lista *L, int dato ){
  45. if( L != NULL ){
  46. struct nodo *e = crear( dato );
  47. L->ultimo->siguiente = e;
  48. L->ultimo = e;
  49.  
  50. return L;
  51. }else{
  52. struct nodo *e = crear( dato );
  53. struct lista *l = calloc( sizeof( struct lista ), 1 );
  54. l->primero = e;
  55. l->ultimo = e;
  56.  
  57. return l;
  58. }
  59. }
  60.  
  61. struct nodo *crear( int dato ){
  62. struct nodo *e = calloc( sizeof( struct nodo), 1 );
  63. e->dato = dato;
  64. e->siguiente = NULL;
  65.  
  66. return e;
  67. }
  68.  
  69. struct lista *ordenar(struct lista *L){
  70. struct nodo *pivote = NULL,*actual = NULL;
  71. int tmp;
  72. if(L != NULL){
  73. pivote = L->primero;
  74. while(pivote != L->ultimo){
  75. actual = pivote->siguiente;
  76. while(actual != NULL){
  77. if(pivote->dato > actual->dato){
  78. tmp = pivote->dato;
  79. pivote->dato = actual->dato;
  80. actual->dato = tmp;
  81. }
  82. actual = actual->siguiente;
  83.     }
  84. pivote = pivote->siguiente;
  85.     }
  86. }
  87.   else{
  88.     printf("Error lista no inicializada");
  89.    }
  90. return L;
  91. }
  92.  
  93. void mostrar(struct lista *L){
  94. struct nodo *auxiliar;
  95. int i=0;
  96. auxiliar = L->primero;
  97.  
  98.    printf("\n\n Mostrando lista ordenada:\n");
  99.  
  100. while (auxiliar!=NULL) {
  101. printf( "\n %d", auxiliar->dato);
  102. auxiliar = auxiliar->siguiente;
  103. i++;
  104. }
  105. if (i==0) printf( "\nLa lista está vacía!!\n" );
  106. }
  107.  

Saludos.
144  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 10 Julio 2016, 02:50 am
Que más se puede pedir, gracias por tu tiempo y ya me pongo a estudiar tú código. -
Es una buena oportunidad para decir algo que hace mucho disiento con la mayoría de los que responden en los foros, el tema de retacear código, por aquello de que no se hacen tareas y el prejuicio de que nadie aprende con copiar y pegar, digo, no les parece que es mejor(si tienen el tiempo necesario) escupir código, como leí por allí que un modelador retaba a un participante con esta frase y que los que preguntamos nos hagamos cargo de que es lo que nos conviene?.           

Saludos y un abrazo para todos.
145  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 10 Julio 2016, 02:07 am
Hola, ivancea96. -
Yo no puse las imágenes para que lo que está escrito sea relevante, solo para que me digan si tienen algún error de concepto. - 

Alberto, No puedo creer lo que estoy viendo, posteaste el código y yo sin enterarme, no lo puedo creer

Saludos.   
146  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 10 Julio 2016, 00:12 am
Hola, gente. -
Les pido un esfuerzo más, alguien que tenga mucho tiempo y ganas me podría decir si lo que puse en las imágenes es medianamente correcto. -




Saludos. 
147  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. en: 7 Julio 2016, 22:19 pm
Hola, que tengan un muy buen día. -
ivancea96, no lo intente de esa manera porque a la apurada leí que era muy costoso hacerlo directamente sobre la lista y como Alberto me sugirió hacerlo de la otra manera no lo pensé demasiado y lo intente, pero no hay caso no solo no me sale, sino que ahora también descubro que no tenía demasiado conocimiento de estructuras anidadas, en conclusión estoy en un pozo demasiado profundo y muy confundido. -
Descarte el código que deje en el primer post y lo estoy intentando con el programa que esta en el video de Alberto sin el borrado de nodo, lo que ocurre es que podría aprenderme la sintaxis de memoria y continuar pero tengo claro que esa no es la forma de estudiar en serio. -
En definitiva, voy a respirar muy profundo, pensar tranquilo e intentar interpretar lo que ahora me tiene ocupado que son las 2 estructuras, créanme que si los tuviera sentado frente a una computadora a algunos de Uds. ni siquiera así intentaría pedirles alguna ayuda dado que es algo que me da vueltas con respecto a las dos estructuras pero no logro expresar exactamente lo que no entiendo.
En conclusión, voy a seguir pensando en el tema y si me surge alguna duda concreta la voy a postear.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //LsL001
  5.  
  6. struct nodo{
  7. int dato;
  8. struct nodo *siguiente;
  9. };
  10.  
  11. struct lista{
  12. struct nodo *primero;
  13. struct nodo *ultimo;
  14. };
  15.  
  16. struct lista *agregar( struct lista *L, int dato );
  17. struct nodo *crear( int dato );
  18.  
  19. int main( void ){
  20. struct lista *Lista = NULL;
  21.  
  22. Lista = agregar( Lista, 1 );
  23. Lista = agregar( Lista, 2);
  24. Lista = agregar( Lista, 3);
  25.  
  26. return 0;
  27. }
  28.  
  29. struct lista *agregar( struct lista *L, int dato ){
  30. if( L != NULL ){
  31. struct nodo *e = crear( dato );
  32. printf( "\n Creando elemento con valor %d", dato );
  33. L->ultimo->siguiente = e;
  34. L->ultimo = e;
  35.  
  36. return L;
  37. }else{
  38. struct nodo *e = crear( dato );
  39. struct lista *l = calloc( sizeof( struct lista ), 1 );
  40. printf( "\n Inicializando la lista con valor %d", dato );
  41. l->primero = e;
  42. l->ultimo = e;
  43.  
  44. return l;
  45. }
  46. }
  47.  
  48. struct nodo *crear( int dato ){
  49. struct nodo *e = calloc( sizeof( struct nodo), 1 );
  50. e->dato = dato;
  51. e->siguiente = NULL;
  52.  
  53. return e;
  54. }
  55.  
  56. /*
  57. ============================== LsL001 ==============================
  58. - Definir estructura.
  59. - Inicializar.
  60. - Agregar elementos.
  61. - Ordenar elementos.
  62. - Borrar elementos.
  63.  */
       

Saludos.   
148  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. 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. -

 
149  Programación / Programación C/C++ / Re: Ordenar lista simplemente enlazada en lenguaje C. 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.
 
150  Programación / Programación C/C++ / 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.
Páginas: 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 ... 37
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines