将二进制搜索树转换为链接列表错误

时间:2017-11-14 00:29:44

标签: c binary-search-tree

我正在尝试将bst转换为链接列表,但在尝试调用要在显示器上打印的列表时出现错误。

这是我的主要功能代码,

ListNodePtr createListnode(int key) {
    ListNodePtr newList = (ListNodePtr)malloc(sizeof(struct ListNode));

    if (newList != NULL) {
            newList->key = key;
            newList->next = NULL;
            return newList;
    } else {
            return NULL;
    }
}

ListNodePtr insertNodeIntoList(ListNodePtr root, const ListNodePtr z) {
    if (root == NULL) {
            root = createListnode(z->key);
    } else {
            root->next = insertNodeIntoList(root->next, z);
    }
    return root;
}

void linkedListINIT(ListNodePtr list, TreeNodePtr root) {
    if (root != NULL) {
            linkedListINIT(list, root->left);
            ListNodePtr current = createListnode(root->key);
            list = insertNodeIntoList(list, current);
            linkedListINIT(list, root->right);
    }
    return;
}

ListNodePtr convertBSTtoLinkedList(TreeNodePtr root) {
    ListNodePtr list = NULL;

    linkedListINIT(list, root);

    return list;
}

这是listNodePtr和print函数的初始化。

struct ListNode {
    int key;
    struct ListNode *next;
};

typedef struct ListNode *ListNodePtr;

void printList(ListNodePtr head) {
    if (head != NULL) {
            printf("%d ", head->key);
            printList(head->next);
    }
    return;
}

问题是,当我尝试打印最终列表时,即使“当前'如果我用print语句检查它,变量输出正确。我不确定它出错的地方,main函数只调用convertBSTtoLinkedList和printList。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

在函数调用linkedListINIT (list, root)中,函数linkedListINIT()不可能修改变量list。它的定义并不重要;它只是不可能修改作为参数传递的变量,因为C语言是严格按值传递的。

因此,如果不读取convertBSTtoLinkedList()的定义,我知道它总是返回NULL。

答案 1 :(得分:0)

修改函数insertNodeIntoList()linkedListINIT(),如下所示

ListNodePtr insertNodeIntoList(ListNodePtr root, int z) {
    if (root == NULL) {
            root = createListnode(z);
    } else {
            root->next = insertNodeIntoList(root->next, z);
    }
    return root;
}

void linkedListINIT(ListNodePtr list, TreeNodePtr root) {
    if (root != NULL) {
            linkedListINIT(list, root->left);
            list = insertNodeIntoList(list, root->key);
            linkedListINIT(list, root->right);
    }
    return;
}

希望它对你有用!