C通过结构的RBTREE成员的指针进行进一步处理



我想从我的rbtree neighbourlist中读取所有pind,然后将它们存储在数组中。int pind只是另一个数组的索引,我想根据我的rbtree中存储的adresses更改值。

i在每个像素中都有一系列结构(像素)和rbtree。

//File rbtree.h
typedef struct rbtree_node_t {
int rInd;                       
int pInd;                       
struct rbtree_node_t* left;
struct rbtree_node_t* right;
struct rbtree_node_t* parent;
enum rbtree_node_color color;
} *rbtree_node;
typedef struct rbtree_t {
rbtree_node root;
} *rbtree;
//File rbtree.c
rbtree rbtree_create() {
rbtree t = malloc(sizeof(struct rbtree_t));
t->root = NULL;
verify_properties(t);
return t;
}

//----------------------------------------------------------------------------

//File main.c
typedef struct _Pixel
{
int mean;   
rbtree neighbourList;
int index;
}Pixel;

void init(Pixel* p)
{
...
r[index].neighbourList = rbtree_create();
...
}
//----------------------------------------
void changepixel(Pixel* p,int index)
{
int *arr=NULL;
int i;
int size;
rbtree npl = r[index].neigbourList;
size = count(npl);
arr = calloc(size, sizeof(int));

AddNodeToArray(npl, arr, 0);
for (i=0; i<size; i++)
{
    printf("arr[%d]: %dn", i, arr[i]);
}
}
int AddNodeToArray(rbtree node, int arr[],int i);
{
if(node == NULL)
      return i;

 arr[i] = node->pInd;
 i++;
 if(node->left != NULL)
      i = AddNodeToArray(node->left, arr, i);
 if(node->right != NULL)
      i = AddNodeToArray(node->right, arr, i);
 return i;
}
int count(rbtree* node)
{
int c = 1;
if (node == NULL)
    return 0;
else
{
    c += count(node->left);
    c += count(node->right);
    return c;
 }
}

//------------------------------
Pixel *p;
p =  malloc((nx*ny)*sizeof(struct _Pixel));
Pixel p = r[10];
print_tree(p.npList);
changepixel(p,p.label);

有人可以解释我为什么用

打印树
void print_tree_helper(rbtree_node n, int indent);
void print_tree(rbtree t) {
print_tree_helper(t->root, 0);
puts("");
}
void print_tree_helper(rbtree_node n, int indent) {
int i;
if (n == NULL) {
    fputs("<empty tree>", stdout);
    return;
}
if (n->right != NULL) {
    print_tree_helper(n->right, indent + INDENT_STEP);
}
for(i=0; i<indent; i++)
    fputs(" ", stdout);
if (n->color == BLACK)
    printf("%d(%d)_bln", (int)n->rInd,(int)n->pInd);
else
    printf("<%d>(%d)_ren", (int)n->rInd,(int)n->pInd);
if (n->left != NULL) {
    print_tree_helper(n->left, indent + INDENT_STEP);
}
}

有效,而我的更改却没有?还是如何使用三个中的所有地址使其正常工作,以进一步处理这些值?

GCC给出了错误:在功能"计数"和函数中'addNodeToArray'请求成员"左"而不是结构或工会

预先感谢您。

您的代码中有太多错误。但是对于countAddNodeToArray,主要问题是您与rbtree_noderbtree类型混淆。rbtree_node是带有您需要的数据的结构,但是rbtree是一个构造的结构,只有一个成员 - 指向rbtree_node类型的根的指针。

我无法测试您的代码以指向所有错误,至少是因为它不完整。但是我想要纠正它,您可以尝试一下。

count应该是

int count_helper(rbtree_node node) {
    int c = 1;
    if (node == NULL)
        return 0;
    else {
        c += count_helper(node->left);
        c += count_helper(node->right);
        return c;
     }
}
int count(rbtree tree) {
    if (tree == NULL)
        return 0;
    else {
        return count_helper(tree->root);
    }
}

AddNodeToArray类似这样的东西

int AddNodeToArray_helper(rbtree_node tree, int arr[], int i) {
    if(node == NULL)
        return i;
     arr[i] = node->pInd;
     i++;
     if(node->left != NULL)
        i = AddNodeToArray_helper(node->left, arr, i);
     if(node->right != NULL)
        i = AddNodeToArray_helper(node->right, arr, i);
    return i;
}
int AddNodeToArray_helper(rbtree tree, int arr[], int i) {
    return AddNodeToArray_helper(tree->root, arr, i);
}

最新更新