2015-05-10 57 views
1

我想讀取我的rbtree neighbourList中的所有pInd,並將它們存儲在數組中。 int pInd只是另一個數組的索引,我想根據我的rbtree中存儲的地址更改值。C傳遞結構的rbtree成員的指針以供進一步處理

我有一個數組結構(像素)和rbtree內每個像素持有neigbours的地址。

//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); 
} 
} 

作品,而我的變化doesen't?或者如何使用三個中找到的所有地址來進一步處理這些值?

GCC給出了錯誤: 函數「計數」和功能「AddNodeToArray」 請求成員的東西「左」不是一個結構或聯合

預先感謝您。

回答

0

代碼中的錯誤太多。但對於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); 
} 
+0

是的,你是對的。我剛剛在你的回答之前就發現了它。謝謝。 – tadata817