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)
| | |-+  Problema con una funcion para verificar si un elemento esta o no
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con una funcion para verificar si un elemento esta o no  (Leído 3,926 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Problema con una funcion para verificar si un elemento esta o no
« en: 14 Junio 2019, 21:52 pm »

Tengo 2 arreglos de estructuras estaticos y tengo que crear un tercer arreglo de estructura de manera dinamica, que contenga los valores que no estan en ambos arreglos estaticos.
El problema me esta saliendo, el problema viene cuando quiero verificar para que no me pase ningun repetido.
Por eso cree la funcion esta que es una booleana, pero al poner esta funcion el programa se rompe.
No se en que le estoy pifiando.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define T 4
  4. #define N 5
  5. struct s_alumno
  6. {
  7.    int numero;
  8. };
  9. typedef struct s_alumno t_alumno;
  10.  
  11. t_alumno* CARGA (t_alumno arreglo1[T],t_alumno arreglo2[N]);
  12. int esta(t_alumno*,int);
  13.  
  14. int main()
  15. {
  16.    int i=0;
  17.    t_alumno*liston=NULL;
  18.    t_alumno arreglo1[T];
  19.    t_alumno arreglo2[N];
  20.    arreglo1[0].numero=1;
  21.    arreglo1[1].numero=7;
  22.    arreglo1[2].numero=3;
  23.    arreglo1[3].numero=5;
  24.  
  25.    arreglo2[0].numero=2;
  26.    arreglo2[1].numero=8;
  27.    arreglo2[2].numero=5;
  28.    arreglo2[3].numero=9;
  29.    arreglo2[4].numero=7;
  30.  
  31.    printf("Conjunto A : %d - %d - %d - %d\n", arreglo1[0].numero,arreglo1[1].numero,arreglo1[2].numero,arreglo1[3].numero);
  32.    printf("Conjunto B : %d - %d - %d - %d - %d \n",arreglo2[0].numero,arreglo2[1].numero,arreglo2[2].numero,arreglo2[3].numero,arreglo2[4].numero);
  33.    liston=CARGA(arreglo1,arreglo2);
  34.    printf ("\nImprimimos Lista:\n");
  35.    while((liston+i)->numero!=0)
  36.    {
  37.        printf(" %d -",(liston+i)->numero);
  38.  
  39.        i++;
  40.    }
  41.  
  42.  
  43.    return 0;
  44. }
  45. t_alumno* CARGA(t_alumno arreglo1[T],t_alumno arreglo2[N])
  46. {
  47.    int i=0,j=0,k=0,maximo=0,bandera=1;
  48.  
  49.    t_alumno* lista=NULL;
  50.    lista=malloc(sizeof(struct s_alumno));
  51.  
  52.    for(i=0;i<T;i++)
  53.    {
  54.  
  55.        for(j=0;j<N;j++)
  56.        {
  57.            if(arreglo1[i].numero==arreglo2[j].numero)
  58.            {
  59.                bandera=0;
  60.            }
  61.        }
  62.        if(bandera==1)
  63.  
  64.        {
  65.                if(!esta(lista,arreglo1[i].numero))
  66.                {
  67.                    (lista+k)->numero=arreglo1[i].numero;
  68.                k++;
  69.                lista=realloc(lista,(1+k)*sizeof(struct s_alumno));
  70.                }
  71.  
  72.  
  73.  
  74.        }
  75.        bandera=1;
  76.    }
  77.  
  78.    /// Proceso Inverso
  79.  
  80.  
  81.    for(i=0;i<N;i++)
  82.    {
  83.        for (j=0;j<T;j++)
  84.        {
  85.            if(arreglo2[i].numero==arreglo1[j].numero)
  86.            {
  87.                bandera=0;
  88.            }
  89.        }
  90.            if(bandera==1)
  91.            {
  92.                (lista+k)->numero=arreglo2[i].numero;
  93.                k++;
  94.                lista=realloc(lista,(1+k)*sizeof(struct s_alumno));
  95.            }
  96.            bandera=1;
  97.    }
  98.  
  99.    (lista+k)->numero=0;
  100. return lista;
  101. }
  102.  
  103. int esta (t_alumno*lista ,int numero)
  104. {
  105.  
  106.  
  107.    int k=0;
  108.    while((lista+k)!=NULL)
  109.    {
  110.        if((lista+k)->numero==numero)
  111.        {
  112.            printf("%d - ",(lista+k)->numero);
  113.            return 1;
  114.        }
  115.        k++;
  116.  
  117.    }
  118.    return 0;
  119. }
  120.  


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con una funcion para verificar si un elemento esta o no
« Respuesta #1 en: 14 Junio 2019, 22:21 pm »

No he mirado el resto del programa pero te puedo adelantar que la línea 108 no es correcta. Un array no acaba cuando el siguiente elemento apunta a NULL, básicamente porque no apunta a NULL. Cuando pasas un array debes pasar su longitud en otro parámetro para saber hasta donde recorrerlo.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Problema con una funcion para verificar si un elemento esta o no
« Respuesta #2 en: 14 Junio 2019, 22:30 pm »

No he mirado el resto del programa pero te puedo adelantar que la línea 108 no es correcta. Un array no acaba cuando el siguiente elemento apunta a NULL, básicamente porque no apunta a NULL. Cuando pasas un array debes pasar su longitud en otro parámetro para saber hasta donde recorrerlo.

Muchas gracias, ahi funciono perfecto. Tenes razon, me equivoque y estaba pensando en listas con el puntero al siguiente.



Y si tengo que ordenar un arreglo dinamico y no se la longitud de ese arreglo dinamico...Hasta que punto tengo que recorrerlo?.
« Última modificación: 15 Junio 2019, 00:44 am por Eternal Idol » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con una funcion para verificar si un elemento esta o no
« Respuesta #3 en: 14 Junio 2019, 22:47 pm »

Y si tengo que ordenar un arreglo dinamico y no se la longitud de ese arreglo dinamico...Hasta que punto tengo que recorrerlo?.
Si creas un arreglo dinámico en algún sitio estás calculando el tamaño que debe tener... guarda esa longitud. En tu caso que vas incrementando en 1 el tamaño con <realloc()>, al final puedes saber también cuál es esa longitud. Mantenla de alguna forma (retorno o referencia). Para ello te recomendaría que la función reciba el nuevo array por referencia y devuelva la longitud de este como valor de retorno:
Código
  1. int CARGA(t_alumno arreglo1[], t_alumno arreglo2[], t_alumno *nuevo_arreglo[]);
El tamaño de la primera dimensión de un array no es necesario pasarlo a la función. También puedes hacerlo al revés:
Código
  1. t_alumno* CARGA(t_alumno arreglo1[], t_alumno arreglo2[], int *longitud_final);
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines