почему такая раздражающая ошибка бинарного дерева поиска (bst) seg.fault? - PullRequest
0 голосов
/ 05 октября 2018

№ входаэлементов, элементов двоичного дерева поиска, входного элемента, поддерево которого вы хотите отобразить

#include <stdio.h>

определение узла структуры bst

typedef struct node
{
int info;
struct node *right, *left;
}NODE; 

вставка fn, узел на листе

struct node* insertBst(struct node* root, int ele)
{

if(root == NULL)
{
    NODE* temp = (NODE*)malloc(sizeof(NODE));
    temp -> info = ele;
    temp -> right = temp -> left = NULL;
    return root;
}

else if(ele > root -> info)
{
    root -> right = insertBst(root -> right, ele);
}

else if(ele < root -> info)
{
    root -> left = insertBst(root -> left, ele);
}


}

в поисках адресаЭлемент

NODE* search(int ele, NODE* root)
{
if( root == NULL) return NULL;
if(ele > root -> info)
{
    return search(ele, root -> right); 
}

else if( ele < root -> info)
{
    return search(ele, root -> left);
}

else if(ele == root -> info) //ele found
{
    return root;
}

 }

с отображением сделанного BST по предварительному заказу: ROOT, LEFT, RIGHT

void preorder(NODE* root)
{
   if(root)
{
    printf("%d ", root -> info);
    preorder(root -> left);
    preorder(root -> right);
 }
}

драйвер, где я вызываю insert для создания моего bst, узла, поддерево которого я >> отображаю

int main()
{
int n, ele; //no. of elements in bst
NODE* root = NULL;
printf("no. of bst elements");
scanf("%d", &n);
printf("elements to be inserted in bst");
for(int i = 0; i < n; ++i)
{
    scanf("%d", &ele);
    NODE* t = insertBst(root, ele);
}

printf("element whose subtree needs to be displayed");
scanf("%d", ele); //elements whose subtree is to be diplayed
NODE *temp;
temp = search(ele, root);
preorder(temp);
}

1 Ответ

0 голосов
/ 05 октября 2018

Вероятно, segfault находится в строке:

scanf("%d", ele);

Где вы должны были передать адрес ele вместо его значения, как вы это делали внутри forloop.

Кроме того, ваша программа не будет работать, потому что функция insertBst никогда не назначит корневой узел, так как в любое время if(root == NULL) верно (всегда), вы будете выделять узел так, как должны, но вы возвращаететот же root, который все еще NULL.Вы, вероятно, намеревались вернуть temp.

Кроме того, рекомендуется проверять temp (после malloc) для указателя NULL перед разыменованием, поскольку malloc может завершиться с ошибкой и вернуть NULLи разыменование это приведет к сбою вашей программы.

...