-7

我正在尝试编写一个搜索某个元素的函数。但是,当我尝试访问元素时,它存在错误。search我评论了在函数中产生错误的行。

#include <stdlib.h>
#include <stdio.h>
#define m 2

typedef struct pag {
    int nr;
    int key[m];
    struct pag * child[m + 1];
}* page;

page init(page B) {
    int i;
    B = malloc(sizeof(struct pag));

    for (i = 0; i < m; i++) {
        B->key[i] = 0;
        B->child[i] = malloc(sizeof(struct pag));
    }
    B->child[i] = malloc(sizeof(struct pag));
    return B;
}

page search(page B, int k) {
    int i;
    if (B == NULL )
        return B;
    // 1. cautare liniara
    for (i = 0; i < m; i++) {
            // 2. find the desired value
        if (B->key[i] == k) {
            return B;
            // 3. find the value greater or equal, take the left road to the child
        } else if (B->key[i] >= k) {
            return search(B->child[i], k); //exists with error here
        }
    }

    return search(B->child[i], k); //also exists with error here
}

int main() {
    page B = init(B);

    if (search(B, 2) == NULL )
        printf("Negasit");
    else
        printf("Gasit");

    return 0;
}
4

1 回答 1

2

您的init函数构建了一个由一个已初始化的根节点和一堆(实际上是 3 个)完全未初始化的子节点组成的两级树。您的所有子节点都包含垃圾。

当您这样做search(B, 2)时,它将查看根节点,然后递归调用search其中一个未初始化的子节点(实际上是最后一个)。由于子节点未初始化,代码将崩溃或执行其他完全不可预测的事情。

在尝试搜索其中的任何内容之前正确初始化您的树。

于 2012-11-28T20:25:52.750 回答