|
121
|
Programación / Programación C/C++ / Re: Dudas con cola e INT_MAX lenguaje C.
|
en: 22 Agosto 2016, 15:47 pm
|
class_OpenGL que decir del tiempo que te tomaste, muchas gracias pero muchas gracias, si bien no puedo decir que lo interpreto todo al pie de la letra, con unos pocos repasos ya me ha aclarado bastante el panorama. - A continuación, pongo el código de la función quitar que era lo que me faltaba, con un solo cambio parece que funciona correctamente, lo que me queda duda es como hago para liberar la memoria del nodo que ya no utilizo, lo quería hacer creando un nodo temporal y luego liberarlo desde hay, pero no estoy seguro si es lo correcto. - Elemento *quitar( Elemento *E, int *cantElementos ){ if( *cantElementos > 0 ){ if( *cantElementos == 1){ E = NULL; }else{ inicio = inicio->siguiente; } *cantElementos -= 1; }else{ printf( "\n Cola vacia\n\n Pulse una tecla para continuar..." ); } return E; }
Saludos.
|
|
|
122
|
Programación / Programación C/C++ / Re: Duda con cola en lenguaje C.
|
en: 21 Agosto 2016, 23:29 pm
|
estoy desconcertado con esto, yo había intentado unas cuantas veces y siempre seguía en el bucle si el ingreso era mayor que el permitido por INT_MAX, ahora resulta que en ciertos casos también me falla y pone un número distinto al ingresado y sale del bucle, debo suponer que esto no tiene solución, soy muy exigente con las validaciones de ingreso de datos. -
|
|
|
123
|
Programación / Programación C/C++ / Re: Duda con cola en lenguaje C.
|
en: 21 Agosto 2016, 22:59 pm
|
El detalle con los elementos es que cada elemento tiene su propio contador de elementos y eso no deberia de ser asi, solo necesitas un contador de elementos y no deberia de ser parte de la esteucutura individual de cada elemento. Si amigo, un graso error él mío, ya lo solucione. -
|
|
|
124
|
Programación / Programación C/C++ / Re: Duda con cola en lenguaje C.
|
en: 21 Agosto 2016, 22:20 pm
|
Hola, gracias a ambos por responder. - class_OpenGL voy a estudiar tu código. - Un entero JAMÁS va a ser mayor que INT_MAX (si eso sucediera, sería un bug del compilador), así que es una tontería poner la condición 'dto <= INT_MAX'
No estoy de acuerdo, si se ingresa un dato mayor a INT_MAX no se sale del bucle, en cambio, si no pongo esta condición el compilador lo transforma a un número negativo o algo por el estilo, no recuerdo. Saludos.
|
|
|
125
|
Programación / Programación C/C++ / Dudas con cola e INT_MAX lenguaje C.
|
en: 21 Agosto 2016, 20:36 pm
|
Hola, gente, que tengan un muy buen día. - Tengo claro que deberíamos pedir ayuda cuando el programa falla y este no es el caso (por lo menos es lo que parece) pero estoy tratando de hacer esto solo y como la mayoría sabe no tengo a quien consultar que no sean Uds. los molesto. - Mi duda está desde la línea 78 a la 96, ¿es todo correcto lo que se encuentra dentro de esas líneas? y otra cosita, como puedo hacer para liberar la memoria de Elem y elem (lineas 78 y 88). Me falta la función quitar que intentare luego de vuestra(s) opinión(es) .- Estoy aprendiendo, por lo tanto, cualquier sugerencia de cambios en el código será bienvenida por dura que sea. - #include <stdio.h> #include <stdlib.h> #include <limits.h> typedef struct ElementoLista{ int dato; int elementos; struct ElementoLista *siguiente; }Elemento; Elemento *inicio = NULL; Elemento *fin = NULL; void menu( void ); void limpiar( void ); Elemento *agregar( Elemento *E ); void mostrar( Elemento *E ); int main( void ){ menu(); return 0; } void menu( void ){ int opc, ok, ch; Elemento *elemento = NULL; do{ do{ limpiar( ); printf( "\n =============== Menu principal ===============\n" "\n 1 - Agregar a la cola" "\n 2 - Quitar de la cola" "\n 3 - Listar cola" "\n 4 - Salir\n" "\n ingrese opcion.....:" ); ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 4; while ((ch = getchar()) != EOF && ch != '\n'); }while( !ok ); switch ( opc ){ case 1: elemento = agregar( elemento ); break; case 2: //cola = quitar( elemento ); break; case 3: mostrar( elemento ); break; case 4: break; } }while( opc != 4 ); } void limpiar( void ){ } Elemento *agregar( Elemento *E ){ int ok, ch, dto; do{ limpiar(); printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX ); ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'); }while( !ok ); if( E != NULL ){ Elemento *Elem = calloc( sizeof( Elemento ), 1 ); Elem->dato = dto; Elem->siguiente = NULL; fin = Elem; Elem->elementos += 1; E->siguiente = Elem; return Elem; }else{ Elemento *elem = calloc( sizeof( Elemento ), 1 ); elem->dato = dto; elem->siguiente = NULL; inicio = elem; fin = elem; elem->elementos = 1; return elem; } return E; } void mostrar( Elemento *E ){ Elemento *auxiliar; if( E != NULL ){ auxiliar = inicio; while( auxiliar != NULL ){ printf( "\n %d", auxiliar ->dato ); auxiliar = auxiliar->siguiente; } }else{ } printf( "\n\n Pulse una tecla para continuar..." ); }
Saludos.
|
|
|
127
|
Programación / Programación C/C++ / Segmentation fault en programa con cola enl lenguaje C.
|
en: 6 Agosto 2016, 22:06 pm
|
Hola, que tengan muy buen día. - Repase el video de donde saque el Ej. una decena de veces y no logro hacer que el programa no me de el error Segmentation fault, busque también en internet el error del compilador y nada. Nota: Alberto, mil disculpas por no copiarlo de tu video que por cierto lo vi un par de veces pero este me pareció más acorde a mis conocimientos (así me fue). - Si además de decirme como solucionarlo (cosa que descarto) si me pondrían poner un poco de teoría del porqué me seria de mucha utilidad para no repetir. - #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ElementoLista{ char *dato; struct ElementoLista *siguiente; }Elemento; typedef struct ListaUbicacion{ Elemento *inicio; Elemento *fin; int tamanio; }Cola; void inicializacion_cola( Cola *serie); int insertar_cola( Cola *serie, Elemento *actual, char *dato ); int quitar_cola( Cola *serie ); void imprimir_cola( Cola *serie ); int main( void ){ Cola *serie; inicializacion_cola( serie ); insertar_cola( serie, serie->fin, "1" ); insertar_cola( serie, serie->fin, "2" ); insertar_cola( serie, serie->fin, "3" ); insertar_cola( serie, serie->fin, "4" ); insertar_cola( serie, serie->fin, "5" ); insertar_cola( serie, serie->fin, "6" ); insertar_cola( serie, serie->fin, "7" ); insertar_cola( serie, serie->fin, "8" ); insertar_cola( serie, serie->fin, "9" ); imprimir_cola( serie ); quitar_cola( serie ); quitar_cola( serie ); quitar_cola( serie ); quitar_cola( serie ); imprimir_cola( serie ); return 0; } void inicializacion_cola( Cola *serie){ serie->inicio = NULL; serie->fin = NULL; serie->tamanio = 0; } int insertar_cola( Cola *serie, Elemento *actual, char *dato ){ Elemento *nuevo_elemento; if( ( nuevo_elemento = (Elemento *)malloc( sizeof( Elemento ))) == NULL ) return -1; if( (nuevo_elemento ->dato = ( char * )malloc(50 * sizeof (char))) == NULL ) return -1; strcpy( nuevo_elemento ->dato , dato ); if( actual == NULL ){ if( serie->tamanio == 0 ){ serie->fin = nuevo_elemento; } nuevo_elemento->siguiente = serie->inicio; serie->inicio = nuevo_elemento; }else if( actual->siguiente == NULL ){ serie->fin = nuevo_elemento; nuevo_elemento->siguiente = actual->siguiente; actual->siguiente = nuevo_elemento; } serie->tamanio++; return 0; } int quitar_cola( Cola *serie ){ Elemento *sup_elemento; if( serie->tamanio == 0 ){ return -1; } sup_elemento = serie->inicio; serie->inicio = serie->inicio->siguiente; free( sup_elemento ->dato ); serie->tamanio--; return 0; } void imprimir_cola( Cola *serie ){ Elemento *actual; int i; actual = serie->inicio; for( i=0; i<serie->tamanio; i++ ){ printf( "\n %p - %s", actual , actual ->dato ); actual = actual->siguiente; } }
Program received signal SIGSEGV, Segmentation fault. 0x00000000004007d2 in inicializacion_cola (serie=0x0) at Cola.c:50 50 serie->inicio = NULL;
Saludos.
|
|
|
128
|
Programación / Programación C/C++ / Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
|
en: 3 Agosto 2016, 14:43 pm
|
Hola, gente. Tal vez fui un tanto duro, pero no entendía porque nadie respondía a mi necesidad, algo que para Uds. debe ser tan simple como respirar(la imagen), de cualquier manera deje mi código ya que lo pude lograr por mí mismo, seguramente se debe poder optimizar pero por lo menos funciona. - Una cosa que me desconcertó es el emoticón o como se llame(desconozco ese tipo moderno de comunicarse) cag. de risa con los ojos cerrados, no me agrado demasiado. - Por último, si para alguien le es molesto mi manera de preguntar casi continuamente, no se obliguen a contestarme no hay ningún problema voy a saber entender que debo cambiar mi insistencia y arreglármelas más a solas al fin me ocasionara un poco de perdida de tiempo, no creo que sea más que eso, por favor no olviden aquello de que tengo 64 años y no encuentro demasiados "amigos" para consultar. - Lo dejo a su consideración.-
Saludos.
|
|
|
129
|
Programación / Programación C/C++ / Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
|
en: 2 Agosto 2016, 13:21 pm
|
struct lista *agregar( struct lista *L, int *contactos ){ int ok, ch, dto; do{ limpiar(); printf( "\n Ingrese dato (mayor a 0 y menor a %d)....: ", INT_MAX ); ok = scanf( "%d", &dto ) == 1 && dto >0 && dto <= INT_MAX ; while ((ch = getchar()) != EOF && ch != '\n'); }while( !ok ); if( L != NULL ){ struct nodo *e = crear( dto ); e->anterior = L->ultimo; L->actual = e; L->ultimo->siguiente = e; L->ultimo = e; *contactos += 1; return L; }else{ struct nodo *e = crear( dto ); struct lista *l = calloc( sizeof( struct lista ), 1 ); l->primero = e; l->ultimo = e; l->actual = e; *contactos += 1; return l; } return L; } struct nodo *crear( int dato ){ struct nodo *e = calloc( sizeof( struct nodo ), 1 ); e->dato = dato; e->siguiente = NULL; e->anterior = NULL; return e; }
Saludos.
|
|
|
130
|
Programación / Programación C/C++ / Re: Agregar nodo a lista doblemente enlazada (lenguaje C)
|
en: 31 Julio 2016, 20:11 pm
|
Hola. Decime si la imagen es correcta, si tengo un solo nodo el recuadro de la izquierda esta bien, si agrego un nuevo nodo las flechas indicarían las modificaciones que debo hacer. - El ultimo Nodo (Nuevo nodo) en su valor siguiente Debe de apuntar a el primero El primer nodo en su valor anterior debe de apuntar al nodo nuevo esto no lo entiendo, para mí está equivocado, perdón... Saludos.
|
|
|
|
|
|
|