2015-05-04 4 views
1

У меня возникли проблемы с этим кодом:Создание узлов в дереве

#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; 
    } 

Он работает почти как задумано, обрабатывающ изображения в квадрантах одного и того же цвета. Однако мне трудно создавать узлы в дереве. Я пытаюсь создать указатель на новый, а затем загрузить этот новый узел с данными, а затем присоединить новый узел к его родительскому узлу.

Я пытался распечатать узел, как только это было сделано, но я получаю сообщение об ошибке, говорящее

запрос для члена «цвета» в чем-то не структуры или объединения

, но когда я удалите эту строку. Я могу напечатать данные в новом узле. Как я могу убедиться, что узел фактически соединяется с деревом? Мне нужно создать структурные варианты для этого: у меня был предыдущий кусок кода, работающий на двоичном дереве, и я пытался его адаптировать.

ответ

3

Это потому, что у вас есть двойной указатель на код, который вы должны разыменования для того, чтобы сделать эту линию работы: printf("%c\n" , p->colour);

То есть, например:

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

Кроме того, обратите внимание, что у вас есть глобальная статическая переменная, также называемая p: static struct quadtree *p = NULL;. Вы можете изменить имя глобальной переменной, чтобы избежать двусмысленности.

3

p указан в первой строке как указатель на указатель, но вы используете его как указатель при попытке печати в строке ниже.

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

Вам необходимо разыменования p, чтобы использовать его в качестве указателя и извлечения colour

Кроме того, вы можете захотеть взглянуть на добавление printTree() функцию, которая может ходить ваше дерево и печать каждого узла. Это может помочь с возможностью отладки и визуализации вашего дерева.

Смежные вопросы