Problem with tree and enhanced queue.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • negative

    #1

    Problem with tree and enhanced queue.

    Dear all,

    I want to create a tree, where every node has an undetermined number
    of children (during the population of the tree, the exact number of
    children of each node , will become clear). So i thought that i could
    use in each node a queue in which we will add, every time a new child
    is born, the address of this node. Here are the structures i have used:

    // The queue node. Every node contains a pointer to a tree node and a
    pointer to the next
    // element of the queue
    typedef struct queue_tag {
    struct TreeNode_tag * child_ptr;
    struct queue_tag * next;
    } QueueNode;

    // the queue
    typedef struct {
    QueueNode *head;
    QueueNode *tail;
    } queue;

    // the tree. Every leaf contains an integer i and a queue which
    contains the pointers to node's children
    typedef struct TreeNode_tag {
    int i;
    queue *q;
    } TreeNode;

    // The tree
    typedef TreeNode * tree;

    The problem is that i get a segmentation fault every time i try to
    access the queue of the tree node. Here is the code i use to start the
    tree :

    tree *t;
    *t = (TreeNode *)malloc(sizeof (TreeNode));

    (*t)->i = 0; // a random value
    (*t)->q->head = NULL; // initially the node has no children.
    (*t)->q->tail = NULL;

    I use gcc.

    Thank you for your time.

  • Chris McDonald

    #2
    Re: Problem with tree and enhanced queue.

    "negative" <panos84@gmail. com> writes:
    [color=blue]
    >The problem is that i get a segmentation fault every time i try to
    >access the queue of the tree node. Here is the code i use to start the
    >tree :[/color]
    [color=blue]
    >tree *t;
    >*t = (TreeNode *)malloc(sizeof (TreeNode));[/color]

    Where have you allocated space for the tree's queue? I think you require:

    *t = malloc(sizeof(T reeNode));
    (*t)->q = malloc(sizeof(Q ueue));

    --
    Chris.

    Comment

    • Ian Malone

      #3
      Re: Problem with tree and enhanced queue.

      negative wrote:[color=blue]
      > Dear all,
      >[/color]

      <snip>
      [color=blue]
      >
      > // the tree. Every leaf contains an integer i and a queue which
      > contains the pointers to node's children
      > typedef struct TreeNode_tag {
      > int i;
      > queue *q;
      > } TreeNode;
      >
      > // The tree
      > typedef TreeNode * tree;
      >
      > The problem is that i get a segmentation fault every time i try to
      > access the queue of the tree node. Here is the code i use to start the
      > tree :
      >
      > tree *t;
      > *t = (TreeNode *)malloc(sizeof (TreeNode));[/color]
      No bearing on your problem, but the cast is unnecessary and
      sizeof( *t ) (brackets optional) is often preferred to sizeof(TreeNode )
      since it's harder to get wrong.
      [color=blue]
      >
      > (*t)->i = 0; // a random value
      > (*t)->q->head = NULL; // initially the node has no children.
      > (*t)->q->tail = NULL;
      >[/color]

      (*t)->q is an uninitialised pointer.

      --
      imalone

      Comment

      • Roland Csaszar

        #4
        Re: Problem with tree and enhanced queue.

        Hi,

        At 5 Jan 2006 05:18:11 -0800,
        negative wrote:
        [color=blue]
        > // The tree
        > typedef TreeNode * tree;
        >
        > The problem is that i get a segmentation fault every time i try to
        > access the queue of the tree node. Here is the code i use to start the
        > tree :
        >
        > tree *t;[/color]
        This is the same as
        TreeNode **t;

        Well, you got some errors here.
        [color=blue]
        > *t = (TreeNode *)malloc(sizeof (TreeNode));[/color]

        Why did you do a typedef, when you are using this instead of
        *t = (tree) malloc (sizeof (TreeNode));

        Here you (try) initialize the value t points to with something, but
        t points to some random place in memory. You should have done something
        like
        t = (tree *) malloc (sizeof (tree));
        first.


        Regards,
        Roland
        --
        Roland Csaszar ----------- \\\ /// -------------- +43 316 495 2129
        Software Development ------ \\\ /// ----------- http://www.knapp.com
        KNAPP Logistics Automation - \\V// - mailto:roland.c saszar@knapp.co m

        Comment

        • negative

          #5
          Re: Problem with tree and enhanced queue.


          Chris McDonald wrote:[color=blue]
          > Where have you allocated space for the tree's queue? I think you require:
          >
          > *t = malloc(sizeof(T reeNode));
          > (*t)->q = malloc(sizeof(Q ueue));
          >
          > --
          > Chris.[/color]

          thanks Chris

          This was finally the problem. I had forgotten to allocate space for
          the tree's queue.

          Negative...

          Comment

          Working...