将节点添加到BST崩溃程序的功能

时间:2016-04-11 00:08:38

标签: c recursion binary-search-tree

我试图将节点添加到我的BST树中,但是使用递归添加节点的实际功能正在崩溃,我不确定原因。我尝试将root->left =更改为root =,递归次数为6次,因为它仍然不能输出我想要的内容。 我的样本输入是:btw(他们不是真人)

6
121 Matt   205000 3000 3  2.0  2000 35 Blueberry Lane
163 Amy  450000 5000 5  5.5   2016  8885 Winter Garden Drive
116 Grant 375000 3000 3 2.0  2015  191 Oviedo Lakes
100 Linda  355000  4000 4 2.5  2014  79 Bradmore Lane
155 Amy  495000  3500  3 3.0   2012  52 Lenox Drive
280  Grant 950000 5000  5   6.5  2016  223 Willow Pines

这是我的代码:

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

bNode* addTreeNode(bNode *tree, bNode temp);
void printTree(bNode *root);
bNode* getNewNode(bNode *data);



int main(void)
{
    bNode *root = NULL;
    int numOfProperties;
    int i;
    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);
    root = addTreeNode(root, temp);
    }
    printTree(root);

    fclose(fp);

    return 0;
}

bNode* getNewNode(bNode* temp){
    bNode* newNode = malloc(sizeof(bNode));
    newNode = temp;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;

}

bNode* addTreeNode(bNode *root,bNode temp){
   printf("Hey boisadd\n");
    if(root==NULL){
        printf("Only Once\n");
        root = getNewNode(&temp);
    }
    else if(temp.listingId < root->listingId){
        root = addTreeNode(root->left, temp);
    }
    else{
        root = addTreeNode(root->right, temp);
    }
    return root;
  /* 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);*/
}

编辑:通过更改getNodeFunction

解决了问题
bNode* getNewNode(bNode temp){
    bNode* newNode = malloc(sizeof(bNode));
    strcpy(newNode->address,temp.address);
    newNode->listingId = temp.listingId;
    newNode->price = temp.price;
    newNode->numOfBaths = temp.numOfBaths;
    newNode->numOfBeds = temp.numOfBeds;
    newNode->propertySize = temp.propertySize;
    newNode->yearBuilt = temp.yearBuilt;
    strcpy(newNode->agent,temp.agent);


    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;

}

1 个答案:

答案 0 :(得分:0)

也许有2个问题。首先是函数getNewNode中的节点赋值操作,它应该是这样的:

bNode* getNewNode(bNode* temp) {
    bNode* newNode = (bNode*)malloc(sizeof(bNode));
    // newNode = temp;

    newNode->listingId = temp->listingId;
    newNode->numOfBaths = temp->numOfBaths;
    newNode->numOfBeds = temp->numOfBeds;
    strcpy(newNode->agent, temp->agent);
    strcpy(newNode->address, temp->address);
    newNode->price = temp->price;
    newNode->propertySize = temp->propertySize;
    newNode->yearBuilt = temp->yearBuilt;

    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

第二个问题是当你将child添加到其父级时,你将返回子节点,该子节点应该分配给子节点而不是它的父节点。

bNode* addTreeNode(bNode *root, bNode temp) {
    printf("Hey boisadd\n");
    if (root == NULL) {
        printf("Only Once\n");
        root = getNewNode(&temp);
    }
    else if (temp.listingId < root->listingId) {
        root->left = addTreeNode(root->left, temp);
    }
    else {
        root->right = addTreeNode(root->right, temp);
    }
    return root;
    /* 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);*/
}