Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 4v1dy4 en 28 Diciembre 2022, 13:56 pm



Título: Linked lists. Una pequeña duda
Publicado por: 4v1dy4 en 28 Diciembre 2022, 13:56 pm
Hasta que me puse a experimentar con otras alternativas para codificar las listas, no me habia fijado en esto.

Si se implementa una funcion de insercion asi:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. struct list
  6. {
  7. char data[512];
  8.  
  9. struct list *next;
  10. };
  11.  
  12. struct list *list_add(struct list **l, struct list element);
  13. //struct list *list_roam(struct list *l);
  14.  
  15. struct list *list_add(struct list **l, struct list element)
  16. {
  17. struct list **aux, *head;
  18. unsigned int count=0;
  19.  
  20. if(*l==NULL)
  21. {
  22. *l=(struct list *)malloc(sizeof(struct list));
  23. if(*l==NULL)
  24. {
  25. return *l;
  26. }
  27.  
  28. memcpy((struct list *) *l,
  29. (struct list *) &element,
  30. sizeof(struct list));
  31.  
  32. (*l)->next=NULL;
  33.  
  34. printf("1st element (addr %x) \n", *l);
  35.  
  36. return *l;
  37. }
  38.  
  39. aux=l;
  40. head=*l;
  41.  
  42. printf("head=%x \n", head);
  43.  
  44. printf("1: (*aux)=%x \n", (*aux));
  45. printf("1: (*aux)->data=%s \n", (*aux)->data);
  46.  
  47. while((*aux)!=NULL)
  48. {
  49. (*aux)=(*aux)->next;
  50. ++count;
  51. }
  52.  
  53. printf("2: (*aux)=%x \n", (*aux));
  54. printf("2: (*aux)->data=%s \n", (*aux)->data);
  55.  
  56. (*aux)=(struct list *)malloc(sizeof(struct list));
  57. if((*aux)==NULL)
  58. {
  59. *l=head;
  60. return *aux;
  61. }
  62.  
  63. memcpy((struct list *) (*aux),
  64. (struct list *) &element,
  65. sizeof(struct list));
  66.  
  67. (*aux)->next=NULL;
  68.  
  69. printf("3: (*aux)->data=%s \n", (*aux)->data);
  70.  
  71. printf("count=%d \n", count);
  72.  
  73. printf("head=%x \n", head);
  74.  
  75. *l=head;
  76. return *aux;
  77. }
  78.  
  79. int main(int argc, char **argv)
  80. {
  81. struct list *l=NULL;
  82. struct list data;
  83.  
  84. printf("linked list \n");
  85.  
  86. strcpy(data.data, "1");
  87. list_add(&l, data);
  88. strcpy(data.data, "2");
  89. list_add(&l, data);
  90. strcpy(data.data, "3");
  91. list_add(&l, data);
  92. strcpy(data.data, "4");
  93. list_add(&l, data);
  94. strcpy(data.data, "5");
  95. list_add(&l, data);
  96.  
  97.        return 0;
  98. }
  99.  

(notese que los prinft son para debugging)

Se como hacer una funcion de insercion funcional. Lo que no entiendo es por que esta forma de implementarla no funciona.

La funcion, segun lo que deduje, se comporta como si (*aux) no apuntara al siguiente nodo cuando la atraviesas, sino a algun otro lugar. No entiendo por que... ¿A donde va a apuntar? Si aux es un puntero, no la estructura. Ademas le especifique (aux=l) como se puede ver arriba.

Agradezco cualquier indicio. Un saludote.