Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 20 Octubre 2016, 16:04 pm



Título: Ejercicio de Parcial - Listas en C - No me sale.
Publicado por: palacio29 en 20 Octubre 2016, 16:04 pm
Hola

Tengo un ejercicio de parcial en el cual tengo que crear 2 listas. En una lista tengo que poner en cada nodo una palabra y la otra lista esta vacia.
Luego tengo que hacer una función que tome esas 2 listas y si la longitud de la palabra de cada nodo  de la lista1 es mayor que 4, tengo que agregar la palabra de forma ordenada a la otra lista.
Entonces Como ejemplo:

Como condición del ejercicio tengo que crear la funcion filtrar_palabras que reciba las 2 listas y el entero limite. Si el limite es 4, entonces tengo que incluir en la 2da lista, todas las palabras que tengan longitud 4 o superior.

Lista original: "A" , "La", "Grande", "Le", "Puse", "Cuca".

Limite: 4;

Lista Modificada: "Cuca", "Grande", "Puse".

He intentado hacerlo y me tira error de ejecucion y nada. Hice un par de cambios pero lo maximo que llegaba era a ejecutar la lista original y cuando queria filtrar, tiraba error de ejecucion, ahora tira error en todo .. :(

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5.  
  6. struct s_nodo
  7. {
  8.    char*txt;
  9.    struct s_nodo*sig;
  10. };
  11. typedef struct s_nodo* t_nodo;
  12.  
  13. void AGREGAR(t_nodo*,char*);
  14. void filtrar_palabras(t_nodo,t_nodo*,int);
  15. void insertar_ordenado(t_nodo*,char*);
  16. void imprimir(t_nodo);
  17.  
  18.  
  19. int main()
  20. {
  21.    t_nodo original=NULL;
  22.    t_nodo filtrado=NULL;
  23.    int limite=4;
  24.    AGREGAR(&original,"a");
  25.    AGREGAR(&original,"la");
  26.    AGREGAR(&original,"grande");
  27.    AGREGAR(&original,"le");
  28.    AGREGAR(&original,"puse");
  29.    AGREGAR(&original,"Cuca");
  30.  
  31.    printf("\nLa lista original es: \n");
  32.    imprimir(original);
  33.  
  34.    filtrar_palabras(original,&filtrado,limite);
  35.  
  36.    printf("\nLa lista filtrada es: \n");
  37.    imprimir(filtrado);
  38.  
  39.    return 0;
  40. }
  41.  
  42.  
  43. void AGREGAR(t_nodo*nodo,char* palabra)
  44. {
  45.    if(*nodo==NULL)
  46.    {
  47.        *nodo=malloc(sizeof(struct s_nodo));
  48.        strcpy((*nodo)->txt,palabra);
  49.        (*nodo)->sig=NULL;
  50.    }
  51.    else
  52.        AGREGAR(&(*nodo)->sig,palabra);
  53. }
  54.  
  55.  
  56. void filtrar_palabras(t_nodo original,t_nodo*filtrado,int longitud)
  57. {
  58.  
  59.    while(original!=NULL)
  60.    {
  61.        if((strlen(original->txt))>=longitud)
  62.        {
  63.            insertar_ordenado(filtrado,original->txt);
  64.        }
  65.        original=original->sig;
  66.    }
  67. }
  68.  
  69.  
  70. void insertar_ordenado(t_nodo*nodo,char* txt)
  71. {
  72.    t_nodo aux=NULL;
  73.    if(*nodo==NULL || ((strcmp((*nodo)->txt,txt))>0))
  74.    {
  75.        aux=malloc(sizeof(struct s_nodo));
  76.        if(aux==NULL)
  77.        {
  78.            printf("Memoria insuficiente");
  79.        }
  80.        strcpy(aux->txt,txt);
  81.        aux->sig=*nodo;
  82.        *nodo=aux;
  83.    }
  84.    else
  85.    {
  86.        insertar_ordenado(&(*nodo)->sig,txt);
  87.    }
  88. }
  89.  
  90. void imprimir(t_nodo nodo)
  91. {
  92.    while(nodo!=NULL)
  93.    {
  94.        printf(" - %s - ",nodo->txt);
  95.        nodo=nodo->sig;
  96.    }
  97. }


Título: Re: Ejercicio de Parcial - Listas en C - No me sale.
Publicado por: MAFUS en 20 Octubre 2016, 18:01 pm
Hay varias cosas: errores que resolver y funciones que optimizar.

El primer error a resolver se encuentra en cuánto generas un nodo nuevo, en cualquiera de las funciones.

La variable txt de la estructura es un puntero, por lo que no puedes copiar directamente el contenido de la cadena, argumento de función, txt a susodicha variable. Primero deberás adquirir el suficiente espacio, mediante malloc, para alojar dicha cadena.

Cuándo crees la función para liberar los nodos de la lista recuerda también liberar las cadenas.


Título: Re: Ejercicio de Parcial - Listas en C - No me sale.
Publicado por: palacio29 en 20 Octubre 2016, 20:20 pm
Hay varias cosas: errores que resolver y funciones que optimizar.

El primer error a resolver se encuentra en cuánto generas un nodo nuevo, en cualquiera de las funciones.

La variable txt de la estructura es un puntero, por lo que no puedes copiar directamente el contenido de la cadena, argumento de función, txt a susodicha variable. Primero deberás adquirir el suficiente espacio, mediante malloc, para alojar dicha cadena.

Cuándo crees la función para liberar los nodos de la lista recuerda también liberar las cadenas.


Hola

Modifique la el programa de manera que en vez de cargar directamente la palabra vaya pidiendola.
De esta forma, logro imprimir la lista original, pero no la otra.

Con lo que dijiste tengo dudas en la linea que dice

strcpy(aux->txt,txt);

Nose como modificarlo para que copie el contenido pidiendo memoria como decis.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5.  
  6. struct s_nodo
  7. {
  8.    char*txt;
  9.    struct s_nodo*sig;
  10. };
  11. typedef struct s_nodo* t_nodo;
  12.  
  13. char*CARGA();
  14. void AGREGAR(t_nodo*);
  15. t_nodo* filtrar_palabras(t_nodo,t_nodo*,int);
  16. void insertar_ordenado(t_nodo*,char*);
  17. void imprimir(t_nodo);
  18.  
  19.  
  20. int main()
  21. {
  22.    t_nodo original=NULL;
  23.    t_nodo filtrado=NULL;
  24.    int limite;
  25.  
  26.    AGREGAR(&original);
  27.    AGREGAR(&original);
  28.    AGREGAR(&original);
  29.    AGREGAR(&original);
  30.    AGREGAR(&original);
  31.    AGREGAR(&original);
  32.    printf("\nIngrese el limite: ");
  33.    scanf("%d",&limite);
  34.    printf("\nLa lista original es \n");
  35.    imprimir(original);
  36.    filtrado=filtrar_palabras(original,&filtrado,limite);
  37.    printf("\nLa lista filtrada es: \n");
  38.    imprimir(filtrado);
  39.  
  40.  
  41.  
  42.    return 0;
  43. }
  44.  
  45.  
  46. void AGREGAR(t_nodo*nodo)
  47. {
  48.    if(*nodo==NULL)
  49.    {
  50.        *nodo=malloc(sizeof(struct s_nodo));
  51.        (*nodo)->txt=CARGA();
  52.        (*nodo)->sig=NULL;
  53.    }
  54.    else
  55.    {
  56.        AGREGAR(&(*nodo)->sig);
  57.    }
  58. }
  59.  
  60. char*CARGA()
  61. {
  62.    char*texto=NULL;
  63.    char letra;
  64.    int i=0;
  65.    texto=malloc(sizeof(struct s_nodo));
  66.    if(texto==NULL)
  67.    {
  68.        printf("Memoria insuficiente");
  69.        return texto;
  70.    }
  71.  
  72.    letra=getche();
  73.  
  74.    while(letra!='\r')
  75.    {
  76.        *(texto+i)=letra;
  77.        i++;
  78.        texto=realloc(texto,(i+1)*sizeof(char));
  79.        letra=getche();
  80.    }
  81.    *(texto+i)='\0';
  82.    printf("\n");
  83.    return texto;
  84. }
  85.  
  86.  
  87. t_nodo* filtrar_palabras(t_nodo original,t_nodo*filtrado,int longitud)
  88. {
  89.    while(original!=NULL)
  90.    {
  91.        if((strlen(original->txt))>=longitud)
  92.        {
  93.            insertar_ordenado(filtrado,original->txt);
  94.        }
  95.        original=original->sig;
  96.    }
  97.    return filtrado;
  98. }
  99.  
  100.  
  101. void insertar_ordenado(t_nodo*nodo,char* txt)
  102. {
  103.    t_nodo aux=NULL;
  104.    if(*nodo==NULL || ((strcmp((*nodo)->txt,txt))>0))
  105.    {
  106.        aux=malloc(sizeof(struct s_nodo));
  107.        if(aux=NULL)
  108.        {
  109.            printf("Memoria insuficiente");
  110.        }
  111.  
  112.        strcpy(aux->txt,txt);
  113.        aux->sig=*nodo;
  114.        *nodo=aux;
  115.    }
  116.    else
  117.    {
  118.        insertar_ordenado(&(*nodo)->sig,txt);
  119.    }
  120. }
  121.  
  122. void imprimir(t_nodo nodo)
  123. {
  124.    while(nodo!=NULL)
  125.    {
  126.        printf(" - %s - ",nodo->txt);
  127.        nodo=nodo->sig;
  128.    }
  129. }



Título: Re: Ejercicio de Parcial - Listas en C - No me sale.
Publicado por: MAFUS en 20 Octubre 2016, 21:51 pm
Obtenida la cadena de texto, por ejemplo supongamos que está en str.
Código:
(*nodo)->txt = malloc((strlen(str)+1) * sizeof(char));
strcpy((*nodo)->txt, str);