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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  struct en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: struct en c  (Leído 2,611 veces)
ronyop

Desconectado Desconectado

Mensajes: 4


Ver Perfil
struct en c
« en: 26 Noviembre 2015, 23:06 pm »

hola como están.
tengo problemas con esta etructura en agregar no. el problema es que no me almacena en en char *filename.
tampoco puedo cambiar de formato de agregar nodo.
desde ya muchas gracias.




#include<stdio.h>
#include<string.h>
#include<stdlib.h>


typedef struct  Nodo{
                                  char *filename;
              struct Nodo*sig;
}nodo_t;

void agregar_nodo(nodo_t**p,char* ruta)
{
 
  nodo_t* nuevo;
   nodo_t*aux;
  nuevo=(nodo_t*)malloc(sizeof(nodo_t));
  nuevo->filename=ruta;
  nuevo->sig=NULL;
  printf("*es:%c\n",ruta);
 
  printf("***es:%c\n",nuevo->filename);
  if(*p==NULL)
  {
    *p=nuevo;
  }
  else
  {
    aux=*p;
    while(aux->sig!=NULL)
    {
      aux=aux->sig;
    }
    aux->sig=nuevo;
  }
}


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: struct en c
« Respuesta #1 en: 27 Noviembre 2015, 08:02 am »

He probado el código y va perfectamente. El único problema que veo es que cuando imprimes la cadena de caracteres, lo haces con un %c. %c es para caracteres. Para imprimir una cadena tendrías que usar %s:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. typedef struct Nodo {
  6.    char* filename;
  7.    struct Nodo* sig;
  8. } nodo_t;
  9.  
  10. void agregar_nodo(nodo_t**p, char* ruta) {
  11.    nodo_t* nuevo;
  12.    nodo_t* aux;
  13.  
  14.    nuevo = (nodo_t*)malloc(sizeof(nodo_t));
  15.    nuevo->filename = ruta;
  16.    nuevo->sig = NULL;
  17.  
  18.    if(*p == NULL) {
  19.        *p = nuevo;
  20.    } else {
  21.        aux = *p;
  22.  
  23.        while(aux->sig != NULL)
  24.            aux = aux->sig;
  25.  
  26.        aux->sig = nuevo;
  27.    }
  28. }
  29.  
  30. int main() {
  31.    nodo_t* nodo = NULL;
  32.    nodo_t* aux = NULL;
  33.  
  34.    agregar_nodo(&nodo, "Hola x1");
  35.    agregar_nodo(&nodo, "Hola x2");
  36.    agregar_nodo(&nodo, "Hola x3");
  37.  
  38.    printf(nodo->filename);
  39.    aux = nodo->sig;
  40.    while(aux != NULL) {
  41.        printf("\n%s", aux->filename);
  42.        aux = aux->sig;
  43.    }
  44.  
  45.    return 0;
  46. }

También tienes que tener cuidado con lo siguiente: Cuando le envias una cadena de caracteres a agregar_nodo, le tienes que enviar una diferente. Por ejemplo, el siguiente código no haría lo esperado:

Código
  1. int main() {
  2.    char cadena[16] = "Codigo";
  3.    nodo_t* nodo = NULL;
  4.    nodo_t* aux = NULL;
  5.  
  6.    agregar_nodo(&nodo, cadena);
  7.    cadena[0] = 'c'; // Ahora cadena vale "codigo"
  8.    agregar_nodo(&nodo, cadena);
  9.    cadena[6] = 's';
  10.    cadena[7] = '\0'; // Ahora cadena vale "codigos"
  11.    agregar_nodo(&nodo, cadena);
  12.  
  13.    printf(nodo->filename);
  14.    aux = nodo->sig;
  15.    while(aux != NULL) {
  16.        printf("\n%s", aux->filename);
  17.        aux = aux->sig;
  18.    }
  19.  
  20.    return 0;
  21. }

El resultado que uno podría esperar es:
Código:
Codigo
codigo
codigos

Pero en realidad el resultado obtenido es:
Código:
codigos
codigos
codigos


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ronyop

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: struct en c
« Respuesta #2 en: 27 Noviembre 2015, 12:22 pm »

gracias  class_OpenGL.
yo ise de esta forma y me ando igual megustaria q lo revisen si tiene algun error.
desde ya muchas gracias.




************************************************************************************************************************

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


typedef struct  Nodo{
              char *filename;
              struct Nodo*sig;
            }nodo_t;

void agregar_nodo(nodo_t **p,char* ruta)
{
  char *pal;
  nodo_t *nuevo;
  nodo_t *aux;
  pal=(char*)malloc(strlen(ruta)+1);
  strcpy(pal,ruta);
  nuevo=(nodo_t*)malloc(sizeof(nodo_t));
 
  nuevo->filename=pal;
  nuevo->sig=NULL;

  if(*p==NULL)
    *p=nuevo;
  else
  {
    aux=*p;
    while(aux->sig!=NULL)
     aux=aux->sig;
    aux->sig=nuevo;
  }
}


void mostrar_lista(nodo_t *p)
{
  while(p!=NULL)
  { printf(". %s\n",p->filename);
    p=p->sig;
  }
}

void borrar_todas_lista(nodo_t*p)
{
  nodo_t*borrar=NULL;
  while(p!=NULL)
  {
    borrar=p;
    p=p->sig;
    free(borrar);
  }
}


int main(void)
{
  nodo_t *lista=NULL;
  char *dato=(char*)malloc(1);
  int i;
 
for (i=0;i<3;i++){
   printf("ingrese el dato de la lista\n");
   scanf("%c",dato);
   while(getchar()!='\n');
    agregar_nodo(&lista, dato);
   }
  printf("\n");
   printf("muestra lista final: \n");
   mostrar_lista(lista);
  printf("\n");
  borrar_todas_lista(lista);
  printf("\n");
   printf("muestra lista borrar: \n");
   mostrar_lista(lista);
  printf("\n");
  return 0;
}
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: struct en c
« Respuesta #3 en: 27 Noviembre 2015, 14:38 pm »

Problemas que he detectado en la función mostrar_lista:
1º Utilizas un while sin sentido. Tienes que usar un if si no quieres un ciclo infinito XD
2º Si tu objetivo era la recursividad, se te ha olvidado el elemento más importante: llamar a la función recursivamente (véase en el código de abajo)

Código
  1. void mostrar_lista(nodo_t* p) {
  2.    if(p!=NULL) {
  3.        printf(". %s\n",p->filename);
  4.        //p=p->sig; Aquí está el error
  5.        mostrar_lista(p->sig); // Esta es la solución
  6.    }
  7. }

En la función borrar_todas_lista comentes errores similares. Así quedaría:

Código
  1. void borrar_todas_lista(nodo_t* p) {
  2.    nodo_t* borrar=NULL;
  3.  
  4.    if(p!=NULL) {
  5.        borrar = p->sig;
  6.        free(p->filename);
  7.        free(p);
  8.        borrar_todas_lista(borrar);
  9.    }
  10. }

Por cierto, date cuenta de que también tienes que liberar de la memoria la cadena de caracteres que has generado con malloc en la función agregar_nodo.

En la función main, declaras un array de un solo elemento (es decir, no cabe el elemento NULL que indica el final de la cadena). La cadena de caracteres tiene que tener como mínimo dos elementos disponibles. También tienes que pedir una cadena de caracteres con la función scanf (sustituye %c por %s)
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ronyop

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: struct en c
« Respuesta #4 en: 27 Noviembre 2015, 15:57 pm »

Ok muchas gracias
En línea

ronyop

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: struct en c
« Respuesta #5 en: 27 Noviembre 2015, 21:55 pm »

tengo problemas  con la siguente funcion.
la funcion tiene que ordenar de forma ascendente o descendentes   y no me ardena.



Código
  1.  
  2. void agregar_nodo(nodo_t**p,char *ruta)
  3. {
  4.  char*pal=(char*)malloc(strlen(ruta));
  5.  nodo_t*nuevo;
  6.  nodo_t*actual;
  7.  nodo_t*anterior;
  8.  strcpy(pal,ruta);
  9. nuevo=(nodo_t*)malloc(sizeof(nodo_t));
  10.  nuevo->filename=pal;
  11.  nuevo->sig=NULL;
  12.  if(*p==NULL)
  13.  {
  14.    *p=nuevo;
  15.  }
  16.  else
  17.  {
  18.    actual=*p;
  19.   anterior=NULL;
  20.  while((actual!=NULL)&&(ruta>actual->filename))
  21.  {
  22.    anterior=actual;
  23.    actual=actual->sig;
  24.  }
  25.  if(anterior==NULL)
  26.  {
  27.    nuevo->sig=*p;
  28.    *p=nuevo;
  29.  }
  30.  else
  31.   {
  32.       anterior->sig=nuevo;
  33.       nuevo->sig=actual;
  34.   }
  35.  }
  36. }
  37.  
  38.  
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: struct en c
« Respuesta #6 en: 28 Noviembre 2015, 01:09 am »

Qué tienes que ordenar de forma ascendente o descendente... Las cadenas no se pueden ordenar de esta forma (al menos de la forma en la que entendemos ordenar...). Tienes que establecer un criterio para ver que cadenas van primero y cuál va última
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: struct en c
« Respuesta #7 en: 28 Noviembre 2015, 01:12 am »

Creo que el algoritmo sería:

Determinas en que posición debe ir la cadena (según tus criterios o los del ejercicio)
Buscas esa posición entre los nodos
Intercalas un nuevo nodo en esa posición
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO]¿Como printear un valor de un struct dentro de otro struct?
Programación C/C++
Firos 0 5,019 Último mensaje 24 Marzo 2011, 13:47 pm
por Firos
Calculadora con struct
Programación C/C++
Constantinoplero 3 4,165 Último mensaje 15 Enero 2012, 18:47 pm
por Constantinoplero
typedef struct vs struct
Programación C/C++
bash 2 2,106 Último mensaje 7 Julio 2015, 23:21 pm
por avesudra
Struct con puntero
Programación C/C++
kraiked 6 1,843 Último mensaje 14 Febrero 2016, 15:32 pm
por Eternal Idol
buscar en struct « 1 2 »
Programación C/C++
angeljonh 11 6,737 Último mensaje 1 Mayo 2017, 15:31 pm
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines