BST树问题-C语言

时间:2018-06-29 22:44:22

标签: c pointers tree binary-search-tree

我正在尝试使用C语言创建BST树,更具体地说是为我的大学练习。该程序需要从输入文件中读取一些整数,对树进行一些操作,并将新数字写入另一个文件(输出文件)中。

但是,该程序仅读取文件的第五行,然后崩溃,导致退出代码3221226356。我对指针的了解不多,因此希望对发现错误有帮助。

这是代码atm(代码的翻译不正确,只是函数名,但是你们应该把这个想法藏在printf的后面)。

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int key;
    struct node *left, *right;
};

struct node *newNode(int item)
{
    struct node *temp =  (struct node *)malloc(sizeof(struct node));
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}


void inorder(struct node *root)
{
    if (root != NULL)
    {
        inorder(root->left);
        printf("%d\n", root->key);
        inorder(root->right);
    }
}

void increaseVector(int *vector_int, int size)
{
    int *temp = realloc(vector_int, ((int)(size+1) * sizeof(int)));
    if(temp == NULL){
        printf("Erro ao increaser o vector.\n");
    }
    else{
        vector_int = temp;
    }
}


struct node *insert(struct node* node, int key)
{   
    if (node == NULL) return newNode(key);

    if (key < node->key)
        node->left  = insert(node->left, key);
    else if (key > node->key)
        node->right = insert(node->right, key);   

    return node;
}

struct node *lesserNodeValue(struct node* node)
{
    struct node* currently = node;

    while (currently->left != NULL)
        currently = currently->left;

    return currently;
}

struct node *deleteNode(struct node* root, int key)
{
    if (root == NULL) return root;

    if (key < root->key)
        root->left = deleteNode(root->left, key);
    else if (key > root->key)
        root->right = deleteNode(root->right, key);
    else
    {
        if (root->left == NULL)
        {
            struct node *temp = root->right;
            free(root);
            return temp;
        }
        else if (root->right == NULL)
        {
            struct node *temp = root->left;
            free(root);
            return temp;
        }

        struct node *temp = malloc(sizeof(struct node));

        temp = lesserNodeValue(root->right);
        root->key = temp->key;
        root->right = deleteNode(root->right, temp->key);
    }
    return root;
}


int middleVector(int *vector, int size){
    if(size == 0){
        return 0;
    }
    else if(size%2 == 0){
        int middle = (int) size/2;
    }
    else{
        int middle = (int) (size-1)/2;
    }
}

void printFile(int *vector_int, int *size)
{
    printf("sizeanho do size: %d\n\n",*size);
    FILE *entrada;
    int tempor = 0;

    entrada = fopen("arquivo entrada.txt","r"); 
    if(entrada==NULL){
        printf("Erro ao abrir o arquivo");
    }
    else{
        while (fscanf(entrada, "%d", &tempor) != EOF)
        {  
            printf("sizeanho do size: %d\n\n",*size);
            increaseVector(vector_int, *size);
            printf("size antes de atribuir ao vector: %d\n\n",*size);
            vector_int[*size] = tempor;
            printf("tempor[%d] = %d\n",*size,tempor);
            *size = (int)*size+1;
        }
        printf("Saiu do WHILE\n\n");
        fclose (entrada);
    }
}

int main()
{
    struct node *root = NULL;   
    int *vector_int = (int *)malloc(NULL);
    int size = 0;
    int i;

    printFile(vector_int, &size); 
    printf("sizeanho apos printFile: %d\n\n",size);
    int posCentralVector = middleVector(vector_int,size);
    printf("middle do vector: %d\n\n", posCentralVector);
    root = insert(root, (int)vector_int[posCentralVector]);

    for(i=0; i<size; i++)
        if(vector_int[i] != root) insert(root, vector_int[i]);

    /*root = insert(root, 50);
    root = insert(root, 350);

    root = deleteNode(root, 10);
    root = deleteNode(root, 96);*/

    inorder(root);
}

输入文件只是一堆随机的新月形数字。

  

10 20 27 34 41 44 46 53 60 68 70 73 82 87 96 101 110 113 122 124 127   133141145147147154155157162163

Output

0 个答案:

没有答案