私はBSTを移動するには再帰的に行うことを理解しています。私はノードを追加しようとしていますが、addTreeNodeにはダブルポインタが必要ですが、シンタックスは混乱していますが、ダブルポインタを追加すると再帰呼び出しでは、「ノード」は構造体または共用体の一部ではないと言います。私はこれらの構造体をどのように管理するのかちょっと混乱しています。バイナリ検索ツリーを再帰的に移動してノードを追加しようとしています
#include <stdio.h>
#include <stdlib.h>
#define ADD_LENGTH 30
typedef struct treeType{
int listingId, price, propertySize;
int numOfBeds, yearBuilt;
double numOfBaths;
char agent[20];
char address[ADD_LENGTH];
struct treeType *left;
struct treeType *right;
}bNode;
typedef struct treeFrame{
bNode *node;
}bTree;
void init(bTree **tree);
void addTreeNode(bTree **tree, bNode *temp);
int main(void)
{
bTree *tree;
int numOfProperties;
int i;
init(&tree);
FILE *fp;
fp = fopen("library.txt","r");
if(fp == NULL){
printf("fopen failed\n");
}
fscanf(fp, "%d", &numOfProperties);
printf("%d\n", numOfProperties);
bNode temp;
// for(i = 0; i < numOfProperties; i++){
fscanf(fp,"%d %s %d %d %d %lf %d %[^\n]s", &temp.listingId, temp.agent,&temp.price,&temp.propertySize,&temp.numOfBeds,
&temp.numOfBaths,&temp.yearBuilt,temp.address);
addTreeNode(&tree, &temp);
//}
fclose(fp);
return 0;
}
void init(bTree **tree){
*tree = malloc(sizeof(bTree));
(*tree)->node= NULL;
}
void addTreeNode(bTree **tree,bNode *temp){
if((*tree)->node == NULL){
(*tree)->node = temp;
(*tree)->node->left = NULL;
(*tree)->node->right = NULL;
}
else if(temp->listingId < (*tree)->node->listingId){
addTreeNode((*tree)->node->left,temp);
}
/* printf("%d %s %d %d %d %.1lf %d %s\n", (*tree)->node->listingId, (*tree)->node->agent, (*tree)->node->propertySize,(*tree)->node->price, (*tree)->node->numOfBeds,
(*tree)->node->numOfBaths, (*tree)->node->yearBuilt, (*tree)->node->address);*/
}
抽象を見てみましたが、私はまだ木を抽象化することについて少し混乱しています。 – Jude
ツリー** IS ** root_nodeへのポインタ、リンクされたリストと同じ方法** IS **は最初の要素へのポインタです。 [抽象化](https://en.wikipedia.org/wiki/Abstraction_%28computer_science%29#Data_abstraction)はあなたのコードのユーザーからそれを隠していて、ここでは* tree *であり、これらの関数で使用しています。実装または使用されているノードはどのようにあなたのビジネスではありません。 – xvan