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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No lee instrucciones de main
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No lee instrucciones de main  (Leído 3,288 veces)
LadyWin

Desconectado Desconectado

Mensajes: 16


Ver Perfil
No lee instrucciones de main
« en: 11 Agosto 2021, 18:39 pm »

Hola! Hice un codigo de insertar elementos ordenados en una lista enlazada, me funciono perfectamente solo que repetia la asignacion de la variable que iba a ingresar a la lista, asi:
num = 1;
agregar_lista (num);
num = 2; ,
agregar_lista (num); ... etc

ahora quise hacerlo con while, deje todo como estaba solamente modifique ese procedimiento, pero no se por que no funciona, no lee lo que hay dentro del while como tampoco lo que hay fuera, incluso intente mostrar en pantalla mensajes al iniciar el programa y tampoco sirve, a que se debe? Antes funcionaba sin ningun problema  :(

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct rNodo {
  5.    int dato;
  6.    struct rNodo * siguiente;
  7. }tNodo;
  8. typedef struct rLista {
  9.    tNodo * primero;
  10.    tNodo * ultimo;
  11.    int longitud;
  12. }tLista;
  13.  
  14. typedef tNodo * Nodo;
  15. typedef tLista * Lista;
  16.  
  17.  
  18. tLista * inicializar (Lista lista);
  19. tNodo * crear_nodo (int nuevo_dato);
  20. tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo);
  21.  
  22.  
  23. int main(void)
  24. {
  25.    Lista lista = inicializar(lista);
  26.    int nuevo_dato;
  27.    int finalizar = 1;
  28. do {
  29. printf("ingrese un numero:");
  30.        scanf("%i", &nuevo_dato);
  31.        lista = ins_de_orden_ascen(lista, crear_nodo(nuevo_dato));
  32.        printf("Quiere ingresar otro numero? 1(si) o 0(no):");
  33.        scanf("%i", &finalizar);
  34.        } while (finalizar == 1);
  35.  
  36.    return 0;
  37. }
  38.  
  39.  
  40. tLista * inicializar (Lista lista) {
  41.    Lista nueva_lista = (tLista*) malloc (sizeof (tLista));
  42.    nueva_lista->primero = NULL;
  43.    nueva_lista->ultimo = NULL;
  44.    nueva_lista->longitud = 0;
  45.    return nueva_lista;
  46. }
  47. tNodo * crear_nodo (int nuevo_dato) {
  48.    Nodo nuevo_elemento = (tNodo*) malloc (sizeof (tNodo));
  49.    nuevo_elemento->dato = nuevo_dato;
  50.    nuevo_elemento->siguiente = NULL;
  51.    return nuevo_elemento;
  52. }
  53. tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo) {
  54.    if (lista->longitud == 0) { // Si la lista es vacia
  55.        nuevo_nodo->siguiente = lista->primero;
  56.        lista->primero = nuevo_nodo;
  57.        lista->ultimo = nuevo_nodo;
  58.    } else {
  59.        Nodo aux = lista->primero; // aux apunta al primer elemento
  60.        Nodo sig;
  61.        int encontro = 0;
  62.        while (encontro == 0) {
  63.            sig = aux->siguiente; // sig apunta al siguiente elemento de aux
  64.             if (aux->dato > nuevo_nodo->dato) { // Si el nuevo elemento es menor al elemento actual
  65.                    nuevo_nodo->siguiente = aux;
  66.                    lista->primero = nuevo_nodo;
  67.                    encontro = 1;
  68.             } else
  69.                 if ((aux->dato < nuevo_nodo->dato) && (sig == NULL)) { // Si el nuevo elemento es mayor al ultimo de la lista
  70.                            nuevo_nodo->siguiente = aux->siguiente;
  71.                            aux->siguiente = nuevo_nodo;
  72.                            lista->ultimo = nuevo_nodo;
  73.                            encontro = 1;
  74.                        } else
  75.                            if ((aux->dato < nuevo_nodo->dato) && (sig->dato > nuevo_nodo->dato)) { // Si se encuentra en el medio de la lista
  76.                                nuevo_nodo->siguiente = aux->siguiente;
  77.                                aux->siguiente = nuevo_nodo;
  78.                                encontro = 1;
  79.                            } else
  80.                                aux = aux->siguiente;
  81.        }
  82.    }
  83.    lista->longitud++; // Aumenta la cantidad de elementos
  84.    return lista;
  85. }


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: No lee instrucciones de main
« Respuesta #1 en: 12 Agosto 2021, 02:00 am »

Me he tomado la libertad de modificar tu código y añadir unas cuantas cosas. De igual forma he comentado cambios y añadidos.

Espero que te sirva.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct rNodo {
  5.    int dato;
  6.    struct rNodo * siguiente;
  7. } tNodo;
  8.  
  9. typedef struct rLista {
  10.    tNodo * primero;
  11.    tNodo * ultimo;
  12.    int longitud;
  13. } tLista;
  14.  
  15. typedef tNodo * Nodo;
  16. typedef tLista * Lista;
  17.  
  18. tLista* inicializar();
  19. tNodo* crear_nodo(int nuevo_dato);
  20. void ins_de_orden_ascen(Lista lista, Nodo nuevo_nodo);
  21. void mostrar(Lista lista);
  22. void liberar(Lista lista);
  23.  
  24. int main(void) {
  25.    Lista lista = inicializar();
  26.    int nuevo_dato;
  27.    int continuar; // cambio el nombre de variable para hacerlo  más coherente. No lo inicializo ya que en el bucle se debe hacer obligatoriamente.
  28. do {
  29. printf("ingrese un numero: ");
  30.        scanf("%i", &nuevo_dato);
  31.        ins_de_orden_ascen(lista, crear_nodo(nuevo_dato));
  32.        printf("Quiere ingresar otro numero? 1(si) o 0(no): ");
  33.        scanf("%i", &continuar);
  34.    } while (continuar);
  35.  
  36.    mostrar(lista);
  37.    liberar(lista);
  38.    return 0;
  39. }
  40.  
  41.  
  42. tLista* inicializar() { // no tiene razón la existencia de un argumento, no se usaba
  43.    Lista nueva_lista = malloc(sizeof (tLista));
  44.    nueva_lista->primero = NULL;
  45.    nueva_lista->ultimo = NULL;
  46.    nueva_lista->longitud = 0;
  47.    return nueva_lista;
  48. }
  49.  
  50. tNodo* crear_nodo(int nuevo_dato) {
  51.    Nodo nuevo_elemento = malloc(sizeof (tNodo));
  52.    nuevo_elemento->dato = nuevo_dato;
  53.    nuevo_elemento->siguiente = NULL;
  54.    return nuevo_elemento;
  55. }
  56.  
  57. void ins_de_orden_ascen(Lista lista, Nodo nuevo_nodo) { // no tiene razón que se devuelva la lista, no se modifica su puntero
  58.    if (lista->longitud == 0) { // Si la lista es vacia
  59.        nuevo_nodo->siguiente = lista->primero;
  60.        lista->primero = nuevo_nodo;
  61.        lista->ultimo = nuevo_nodo;
  62.    } else {
  63.        Nodo aux = lista->primero; // aux apunta al primer elemento
  64.        Nodo ant = NULL;
  65.        while(aux && aux->dato < nuevo_nodo->dato) { // busco el nodo con un dato mayor al nuevo dato, también puede llegar al fin de la lista
  66.            ant = aux; // y me quedo con el nodo anterior
  67.            aux = aux->siguiente;
  68.        }
  69.        if(ant) { // si el nodo anterior existe
  70.            ant->siguiente = nuevo_nodo; // hago que su siguiente apunte al nuevo nodo
  71.            if(lista->ultimo == ant) { // si el nodo anterior era el último de la lista
  72.                lista->ultimo = nuevo_nodo; // ahora debe serlo el nuevo nodo
  73.            }
  74.        } else {
  75.            lista->primero = nuevo_nodo; // en caso contrario quiere decir que el nuevo nodo debe ser el primero
  76.        }
  77.        nuevo_nodo->siguiente = aux; // el siguiente del nodo nuevo debe ser el nodo que debía ser el siguiente, o NULL si había llegado al final de la lista
  78.  
  79.    }
  80.    lista->longitud++; // Aumenta la cantidad de elementos
  81. }
  82.  
  83. void mostrar(Lista lista) { // pinta la lista en pantalla
  84.    puts("--- Lista ---");
  85.    if(!lista) { // No existe lista
  86.        printf("Lista no inicializada");
  87.        return;
  88.    }
  89.    if(lista->longitud == 0) { // Lista vacía
  90.        printf("Lista vacía");
  91.        return;
  92.    }
  93.  
  94.    for(Nodo n = lista->primero; n; n = n->siguiente) { // Muestra todos los nodos
  95.        printf("%d\n", n->dato);
  96.    }
  97. }
  98.  
  99. void liberar(Lista lista) { // Desaloja la lista de la memoria
  100.    Nodo sig;
  101.    if(!lista) { // Si no existe lista no hay que liberar nada
  102.        return;
  103.    }
  104.    while(lista->primero) {
  105.        sig = lista->primero->siguiente;
  106.        free(lista->primero);
  107.        lista->primero = sig;
  108.        // lista->longitud--; // No hace falta esta línea ya que la lista se va a desalojar de la memoria
  109.    }
  110.    free(lista);
  111. }


En línea

LadyWin

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: No lee instrucciones de main
« Respuesta #2 en: 12 Agosto 2021, 03:28 am »

Me he tomado la libertad de modificar tu código y añadir unas cuantas cosas. De igual forma he comentado cambios y añadidos.

Espero que te sirva.


Me ha ayudado un monton los cambios, muchisimas gracias por el tiempo que te tomaste!  ;D ;D ;D ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Sub Main()
Programación Visual Basic
katanaia 5 2,783 Último mensaje 14 Agosto 2008, 04:47 am
por katanaia
Separar instrucciones, pausa entre instrucciones
Java
NelxoN 5 7,031 Último mensaje 28 Marzo 2009, 18:24 pm
por Amerikano|Cls
Ejercutar main desde otro main. « 1 2 »
Programación C/C++
arcanu 10 6,563 Último mensaje 10 Septiembre 2010, 20:13 pm
por arcanu
[cagada]: gcc main.c -o main.c. posibilidad de recuperar codigo fuente??
Programación C/C++
xiruko 5 4,279 Último mensaje 3 Agosto 2012, 06:29 am
por xiruko
Instrucciones 64-bit vs. Instrucciones Avanzadas (SSE, SSE2, SSE3, SSE4, AVX)
ASM
Fly_NighT 8 7,172 Último mensaje 5 Marzo 2014, 07:45 am
por xv0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines