Двоичное дерево поиска, использующее проблему указателей на указатели - PullRequest
0 голосов
/ 14 апреля 2020

Я относительно новичок в программировании на C ++, я пытаюсь создать BST на C ++ и использую для этого указатели, но я не могу понять ошибку в указателях даже после нескольких часов, в основном ошибка возникает в операторе if, где я пытаюсь использовать рекурсия для изменения root при наличии детей от родителя root вот код

#include<iostream>
using namespace std;

struct node{
    struct node* rightchild;
    int data;
    struct node* leftchild;
};

struct node* newNode(int data){
    struct node* node1 = (node*)malloc(sizeof(node));
    (*node1).data=data;
    (*node1).leftchild = NULL;
    (*node1).rightchild = NULL;
    return node1;
}

void insertIntoBST(struct node** ptrtoroot, struct node** ptrtotemp){
    if((**ptrtotemp).data <= (**ptrtoroot).data){
        if((**ptrtoroot).leftchild != NULL){
            insertIntoBST((*ptrtoroot).leftchild,(*ptrtotemp));
        }
        else{
           (*ptrtoroot->leftchild) = *ptrtotemp;
        }
    }
     if((**ptrtotemp).data > (**ptrtoroot).data){
        if((**ptrtoroot).rightchild != NULL){
            insertIntoBST((*ptrtoroot->rightchild),(*ptrtotemp));
        }
        else{
           (*ptrtoroot->rightchild) = *ptrtotemp;
        }
    }

}

void inorder(struct node* root){
    while(root != NULL){
        cout<<(*root).data;
        inorder((*root).leftchild);
        inorder((*root).rightchild);
    }
}

int main(){
    struct node* root = NULL;
    struct node* temp;
    int dat;
    for(int i = 0 ; i < 6 ; i++){
    cin>>dat;
    temp = newNode(dat);
    if(root == NULL){
        root = temp;
    }
    else{
        insertIntoBST(&root,&temp);
    }
 }
 inorder(root);

    return 0;
}

Код ошибки:

bst.cpp:21:40: error: request for member ‘leftchild’ in ‘* ptrtoroot’, which is of pointer type ‘node*’ (maybe you meant to use ‘->’ ?)  
21 | insertIntoBST((ptrtoroot).leftchild,(*ptrtotemp));  
   | ^~~~~~~~~ bst.cpp:24:25: error: request for member ‘leftchild’ in ‘ ptrtoroot’, which is of pointer type ‘node*’ (maybe you meant to use ‘->’ ?)  
24 | (*ptrtoroot->leftchild) = *ptrtotemp;  

1 Ответ

0 голосов
/ 14 апреля 2020

Ладно, на мой взгляд, в вашей функции, как показано ниже.

void insertIntoBST(struct node** ptrtoroot, struct node** ptrtotemp){
    if((**ptrtotemp).data <= (**ptrtoroot).data){
        if((**ptrtoroot).leftchild != NULL){
            insertIntoBST((*ptrtoroot).leftchild,(*ptrtotemp));

ptrto root - это двойной указатель, т.е. указатель на указатель, так что это делает (* ptrto root) указатель и здесь

(*ptrtoroot).leftchild should be replaced with "->" operator 
like (*ptrtoroot)->leftchild

Во-вторых, при рекурсивных вызовах функция insertIntoBST принимает в качестве аргумента двойной указатель, поэтому вам необходимо передать адрес указателя здесь.

т.е. адрес указателя, возвращенного (* ptrto root ) -> leftchild из структуры вашего узла.

something like &((*ptrtoroot)->leftchild)

Я не полностью выполнил ваш код, но это должно работать.

То же самое касается второго параметра (* ptrtotemp).

...