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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejercicio de Parcial - Listas en C - No me sale.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio de Parcial - Listas en C - No me sale.  (Leído 1,971 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Ejercicio de Parcial - Listas en C - No me sale.
« 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. }


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ejercicio de Parcial - Listas en C - No me sale.
« Respuesta #1 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.


En línea

palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Ejercicio de Parcial - Listas en C - No me sale.
« Respuesta #2 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. }

En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ejercicio de Parcial - Listas en C - No me sale.
« Respuesta #3 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);
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,097 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
(Ayuda) Solución parcial de un ejercicio C++ utilizando vectores.
Programación C/C++
xboxone007 2 2,097 Último mensaje 7 Diciembre 2013, 03:40 am
por xiruko
(Consulta) Ejercicio de Listas en C - Error de Ejecucion
Programación C/C++
palacio29 0 1,573 Último mensaje 15 Octubre 2016, 18:12 pm
por palacio29
Ejercicio con listas
Java
tati2050 1 2,206 Último mensaje 2 Septiembre 2017, 01:35 am
por HardC0d3
Ayuda con un ejercicio de Listas y Colas
Programación C/C++
fallenboy69 1 2,011 Último mensaje 17 Marzo 2022, 18:02 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines