C 传递结构的 rbtree 成员的指针以进行进一步处理

C passing pointer of a rbtree member of a struct for further processing

我想从我的 rbtree neighborList 中读取所有 pInd 并将它们存储在一个数组中。 int pInd 只是另一个数组的索引,我想根据我的 rbtree 中存储的地址更改值。

我在每个像素中都有一个结构数组(像素)和 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]: %d\n", 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)_bl\n", (int)n->rInd,(int)n->pInd);
else
    printf("<%d>(%d)_re\n", (int)n->rInd,(int)n->pInd);
if (n->left != NULL) {
    print_tree_helper(n->left, indent + INDENT_STEP);
}
}

有效而我的更改无效?或者如何使用在 3 中找到的所有地址来进一步处理这些值?

GCC 报错: 在函数 'count' 和函数 'AddNodeToArray' 中 请求成员 'left' 不是结构或联合

提前致谢。

你的代码错误太多。但是对于 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);
}