|
Mostrar Mensajes
|
Páginas: 1 [2]
|
12
|
Programación / Programación C/C++ / 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 #include <stdio.h> #include <stdlib.h> typedef struct rNodo { int dato; struct rNodo * siguiente; }tNodo; typedef struct rLista { tNodo * primero; tNodo * ultimo; int longitud; }tLista; typedef tNodo * Nodo; typedef tLista * Lista; tLista * inicializar (Lista lista); tNodo * crear_nodo (int nuevo_dato); tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo); int main(void) { Lista lista = inicializar(lista); int nuevo_dato; int finalizar = 1; do { scanf("%i", &nuevo_dato ); lista = ins_de_orden_ascen(lista, crear_nodo(nuevo_dato)); printf("Quiere ingresar otro numero? 1(si) o 0(no):"); } while (finalizar == 1); return 0; } tLista * inicializar (Lista lista) { Lista nueva_lista = (tLista *) malloc (sizeof (tLista )); nueva_lista->primero = NULL; nueva_lista->ultimo = NULL; nueva_lista->longitud = 0; return nueva_lista; } tNodo * crear_nodo (int nuevo_dato) { Nodo nuevo_elemento = (tNodo *) malloc (sizeof (tNodo )); nuevo_elemento->dato = nuevo_dato; nuevo_elemento->siguiente = NULL; return nuevo_elemento; } tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo) { if (lista->longitud == 0) { // Si la lista es vacia nuevo_nodo->siguiente = lista->primero; lista->primero = nuevo_nodo; lista->ultimo = nuevo_nodo; } else { Nodo aux = lista->primero; // aux apunta al primer elemento Nodo sig; int encontro = 0; while (encontro == 0) { sig = aux->siguiente; // sig apunta al siguiente elemento de aux if (aux->dato > nuevo_nodo->dato) { // Si el nuevo elemento es menor al elemento actual nuevo_nodo->siguiente = aux; lista->primero = nuevo_nodo; encontro = 1; } else if ((aux->dato < nuevo_nodo->dato) && (sig == NULL)) { // Si el nuevo elemento es mayor al ultimo de la lista nuevo_nodo->siguiente = aux->siguiente; aux->siguiente = nuevo_nodo; lista->ultimo = nuevo_nodo; encontro = 1; } else if ((aux->dato < nuevo_nodo->dato) && (sig->dato > nuevo_nodo->dato)) { // Si se encuentra en el medio de la lista nuevo_nodo->siguiente = aux->siguiente; aux->siguiente = nuevo_nodo; encontro = 1; } else aux = aux->siguiente; } } lista->longitud++; // Aumenta la cantidad de elementos return lista; }
|
|
|
13
|
Programación / Programación C/C++ / Lista Enlazada - asignar memoria
|
en: 30 Julio 2021, 23:01 pm
|
Hola gente!, estaba leyendo un codigo en internet y me surgieron algunas dudas: typedef struct ElementoLista { char *dato; struct ElementoLista *siguiente; } Elemento; typedef struct ListaIdentificar { Elemento *inicio; Elemento *fin; int tamanio; } Lista;
int ins_en_lista_vacia (Lista * lista, 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 ); nuevo_elemento->siguiente = NULL; lista ->inicio = nuevo_elemento; lista ->fin = nuevo_elemento; lista ->tamanio++; return 0; }
Es una funcion para insertar un elemento a una lista vacia, en la condicion 'if' primero le asigna espacio en la memoria a 'nuevo_elemento' y despues compara ese resultado con NULL, que significa eso? Generalmente asigno NULL a los punteros que todavia no apuntan a un elemento, ademas que en esa funcion le asigno memoria a 'nuevo_elemento' y despues a 'nuevo_elemento->dato', no seria suficiente con asignar memoria solo a 'nuevo_elemento->dato'? int main (void){ char eleccion; char *nom; Lista *lista; Elemento *actual; if ((lista = (Lista *) malloc (sizeof (Lista ))) == NULL ) return -1; if ((nom = (char *) malloc (50)) == NULL ) return -1;
Mi otra duda es que pude notar que asigno memoria a una estructura entera, 'Lista', no a una variable de tipo 'Elemento' como hizo en la funcion de insercion, por que no hacer lo mismo con todas las estructuras? No como hizo en la funcion 'ins_en_lista_vacia' que asigno en dos situaciones. Espero no haber hecho muchas preguntas, realmente me tiene confundida este tema de asignar memoria y no encuentro un medio para poder entenderlo mejor. Desde ya muchas gracias.
|
|
|
14
|
Programación / Programación C/C++ / Re: Invocacion funcion con variables de tipo puntero
|
en: 20 Julio 2021, 17:44 pm
|
Tienes un problema en la línea 3: Para crear los diferentes elementos del array has escrito (1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1) Con los paréntesis no generas elementos, sino que agrupas operaciones. Pues bien dentro de los paréntesis estás usando el operador coma. El operador coma es un operador binario que evalúa la primera expresión y descarta su valor, después evalúa la segunda expresión y devuelve el resultado. Encadenando expresiones, cómo lo has hecho estás devolviendo el último operando de cada grupo de paréntesis. Por otra parte, cuándo inicializas un array se puede hacer de forma incompleta dando valor a las primeras posiciones; el compilador entiende que debe dejar las siguientes a 0 por lo que en realidad tu código genera el siguiente array: 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Para solucionar esto sólo cambia los paréntesis por llaves en tu inicialización del array. Mil gracias, ahora me funciona correctamente!
|
|
|
15
|
Programación / Programación C/C++ / Re: Invocacion funcion con variables de tipo puntero
|
en: 20 Julio 2021, 17:43 pm
|
Hola @LadyWin
Te dejo mis ideas jaja...Por ahi ya lo sabes pero, creo que la única forma que eso te retorna 0 es que ese if de la línea 9 es distinto de cero. Al utilizar punteros acordate que modificas el valor de la variable misma... entonces, la segunda llamada no va a devolver 1 porque se modificaron las variables en sí mismas. Osea que te está posicionando en otro casillero del tablero que no es cero... Por ahi te interese hacer paso de parametros por valor, y vos le pasas la posición del tablero que queres evaluar.
Luego... en mi humilde opinión, te conviene hacer más descriptivos los nombres de tus variables y funciones, código aburrido y simple = código funcional y facil de mantener. Por ejemplo, la función puede llamarse: evalua_movimiento_caballo(), de un vistazo ya sabes qué hace.
PD: en el caso de que esa función busque las posibles posiciones del caballo (las que son igual a cero en la matriz), tal vez podrías hacer un while o for que recorra cada fila de la matriz hasta que encuentre una posición cero, y si no encuentra ninguna salta a la fila que viene...
Tenés razon, mejorare el nombre que utilizo para mis variables y funciones, gracias por el dato!
|
|
|
16
|
Programación / Programación C/C++ / Invocacion funcion con variables de tipo puntero
|
en: 20 Julio 2021, 00:59 am
|
Hola, esto es una parte de un programa que estoy haciendo que evalúa los posibles movimientos, en este caso, de un caballo de el ajedrez, los 0 serian espacios vacíos, el punto de partida seria el 0 de la posición v[4][0]: 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1int main (){ int a=4,b=0; int v[N][M]={(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)}; printf(" return--> %i ",mov1 (v ,&a ,&b )); //devuelve 1 printf(" return--> %i ",mov1 (v ,&a ,&b )); // pero aca devuelve 0 return 0; } int mov1 (int v[N][M],int *a,int *b){ if (v[*a-2][*b+1]==0){ *a=*a-2; *b=*b+1; return 1; }else{ return 0; } }
Este código debería retornar dos veces 1 pero desconozco la razón del porqué en la segunda invocación no me evalúa correctamente la condición de if y me devuelve 0, se deberá a que estoy utilizando mal los punteros?
|
|
|
|
|
|
|