【问题标题】:Creating nodes in a tree在树中创建节点
【发布时间】:2015-05-04 16:21:12
【问题描述】:

这段代码有问题:

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

struct quadtree
   {
   char colour;
   int x_coordinate;
   int y_coordinate;
   int size;
   struct quadtree *NW, *NE, *SE, *SW, *p;
   };

static struct quadtree *p = NULL;

int size;
int i;
int pixels;
int width;
int black_pixels;

void insert(struct quadtree **p , char colour , int size , int x_coordinate , int y_coordinate)
{    
     struct quadtree *new;
     new = (struct quadtree *) malloc ( sizeof(struct quadtree) );
     new->NW = new->NE = new->SE = new->SW = NULL;
     new->colour = colour;
     new->size = size;
     new->x_coordinate = x_coordinate;    
     new->y_coordinate = y_coordinate;
     *p = new;
    /* printf("%c\n" , p->colour); */
     printf("%c\n" , new->colour);
     return;
}


void colour_test(int x[] , int y[] , int size , int x_coordinate , int y_coordinate , struct quadtree *p)
{ 
   pixels = 0;
   for (i = 0 ; i < black_pixels ; i++)
      if (x[i] >= x_coordinate && x[i] < (size + x_coordinate) && y[i] <= y_coordinate && y[i] > (y_coordinate - size))
         pixels++;

   if (pixels == 0) 
      {
      insert(&p , 'W' , size , x_coordinate , y_coordinate);
    /* printf("Node has coordinates (%d,%d) and a size of %d\n" , x_coordinate , y_coordinate , size); */
      }
   else if (pixels == size*size) 
      {
      insert(&p , 'B' , size , x_coordinate , y_coordinate);   
   /*   printf("Node has coordinates (%d,%d) and a size of %d\n" , x_coordinate , y_coordinate , size); */
      }
   else
      { 
      insert(&p , 'G' , size , x_coordinate , y_coordinate);
   /*   printf("Node has coordinates (%d,%d) and a size of %d\n" , x_coordinate , y_coordinate , size); */
      colour_test(x , y , size/2 , x_coordinate , (y_coordinate - (size/2)) , p->NW); 
      colour_test(x , y , size/2 , (x_coordinate + (size/2)) , (y_coordinate - (size/2)) , p->NE); 
      colour_test(x , y , size/2 , (x_coordinate + (size/2)) , y_coordinate , p->SE); 
      colour_test(x , y , size/2 , x_coordinate , y_coordinate , p->SW); 
      }
}

int main()
   { 
   scanf("%d" , &width);
   scanf("%d" , &black_pixels);

   int x[black_pixels];
   int y[black_pixels];
   for (i = 0 ; i < black_pixels ; i++)
      scanf("%d%*[ ]%d" , &x[i] , &y[i]);
/*
   printf("Image width = %d\n" , width );
   printf("Total black pixels = %d\n" , black_pixels);
   for (i = 0 ; i < black_pixels ; i++)
      printf("%d %d\n" , x[i] , y[i]);
*/
   size = width;
   colour_test(x , y , size , width - size , (width - 1) , p);  

   return 0;
   }

它几乎按预期工作,在相同颜色的象限中处理图像。但是我无法在树中创建节点。我正在尝试创建一个指向新节点的指针,然后用数据加载该新节点,然后将新节点加入它的父节点。

完成后我尝试打印出节点,但收到一条错误消息,提示

在非结构或联合的情况下请求成员“颜色”

但是当我删除该行时,我可以在新节点中打印数据。如何确保节点实际上加入了树?我是否需要创建结构变体来执行此操作:我之前有一段代码适用于二叉树,我一直在尝试从中调整它。

【问题讨论】:

    标签: c treenode quadtree


    【解决方案1】:

    这是因为您的代码中有一个双指针,您必须取消引用才能使该行正常工作:printf("%c\n" , p-&gt;colour);

    即例如:

    printf("%c\n" , (*p)->colour);
    

    另外,请注意,您有一个全局静态变量,也名为 p:static struct quadtree *p = NULL;。您可以更改全局变量的名称以避免歧义。

    【讨论】:

      【解决方案2】:

      p 在第一行被声明为指向指针的指针,但您在尝试在下面的行中打印时将其用作指针。

      struct quadtree **p
      printf("%c\n" , p->colour);
      

      您需要取消引用p 以将其用作指针并提取colour

      此外,您可能希望添加一个printTree() 函数,该函数可以遍历您的树并打印每个节点。这可能有助于调试和可视化您的树。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多