home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / c / 12231 < prev    next >
Encoding:
Text File  |  1992-08-12  |  3.4 KB  |  75 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!mcsun!sunic!ugle.unit.no!sigyn.idt.unit.no!bjornmu
  3. From: bjornmu@idt.unit.no (Bj|rn P. Munch)
  4. Subject: Re: general tree
  5. Message-ID: <1992Aug12.192529.8628@ugle.unit.no>
  6. Sender: news@ugle.unit.no (NetNews Administrator)
  7. Reply-To: bjornmu@idt.unit.no (Bj|rn P. Munch)
  8. Organization: Div. of CS & Telematics, Norwegian Institute of Technology
  9. References: <1992Aug11.220049.861@ugle.unit.no> <chuckb.713584418@milton> <1992Aug12.092635.27271@ugle.unit.no> <6t4myyq.qualtrak@netcom.com>
  10. Date: Wed, 12 Aug 92 19:25:29 GMT
  11. Lines: 62
  12.  
  13. In article <6t4myyq.qualtrak@netcom.com>, qualtrak@netcom.com (Qual Trak) writes:
  14. |> In article <1992Aug12.092635.27271@ugle.unit.no> bjornmu@idt.unit.no (Bj|rn P. Munch) writes:
  15. |> >In article <chuckb.713584418@milton>, chuckb@milton.u.washington.edu (Chuck Bass) writes:
  16. |> >|> bjornmu@idt.unit.no (Bj|rn P. Munch) writes:
  17. |> >|> 
  18. |> >|> >In article <1992Aug11.200208.19716@infonode.ingr.com>, dpm@wizard.b29.ingr.com (David Mikesell) writes:
  19. |> >|> >|> 
  20. |> >|> >|> I am beginning work on a C program that will manipulate a general tree, i.e.
  21. |> >|> >|> a tree in which each node can have an arbitrary number of children.  An ex-
  22. |> >|> >|> ample declaration of the structure follows:
  23. |> >|> >|> 
  24. |> >|> >|> struct node
  25. |> >|> >|> {
  26. |> >|> >|>     DATA        data;
  27. |> >|> >|>     struct node *parent;
  28. |> >|> >|>     struct node **children;
  29. |> >|> >|> };
  30. |> >|> 
  31. |> >|> >In stead of putting the children into an array (what do you do if this
  32. |> >|> >array suddenly isn't big enough?), you may consider putting them in a
  33. |> >|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  34. |> >|> This is a perfect time to use something like ... realloc.
  35. |> >
  36. |> >I also thought about realloc(), but soon realized this would be a
  37. |> >rather bad idea.  Maybe I should have explained why...
  38. |> >
  39. |> >Remember: realloc() may move your array to another address.  If you
  40. |> >have references to the children that were stored there (like parent
  41. |> >pointers in _their_ children), then you're in deep trouble.
  42. |> >
  43. |> 
  44. |> Seems to me realloc () will work quite adequately if you reference the
  45. |> children pointer explicitly thru the node - i.e.
  46. |>     struct node *nodeptr, (nodeptr1;
  47. |> 
  48. |>     nodeptr1 = nodeptr->children [0];
  49. |> 
  50. |> Will always return you the same value even if nodeptr->children has been
  51. |> realloced ();
  52.  
  53. Oops, my mistake.  "children" is an array of _pointers_ to nodes, so of
  54. course it doesn't matter if they are moved by realloc().  The nodes
  55. themselves do not move and the pointers are still valid.....
  56.  
  57. I still like the sibling list, though.  You may need one more pointer
  58. dereferencing to get at each child, but you save the address
  59. calculation needed for indexing.  Of course, if you often need to get
  60. directly at child number N > 1, the array is far more efficient.
  61.  
  62. And if you look carefully, you will see that the array soultion
  63. actually requires more space.  Both use three pointer per node, but
  64. you may have more malloc() fragments, plus you need to store # of
  65. children.
  66.  
  67. Well, I guess the most important factor is how this tree is going to
  68. be used.  Either approach would be best in some cases.
  69.  
  70. ---
  71. Bj|rn P. Munch               | Dept. of Comp. Science & Telematics,
  72. Bjoern.P.Munch@idt.unit.no   | Norwegian Institute of Technology (NTH),
  73. PhD Student                  | N-7034 Trondheim, Norway
  74.  (some filler words here)    | Fingerable addr:  bjornmu@multe.idt.unit.no
  75.