указател срещу двоен указател за свързан списък и двоично дърво

  1. За единичен списък с връзки

    1.1. Това видях от един урок, написах само важната част.

    sortedInsert(Node **root, int key){};
    int main(){
        Node *root = &a;
        sortedInsert(&root, 4);
    }
    

    1.2. Въпреки това току-що използвах показалец вместо двоен показалец и всичко работи добре, мога да вмъкна ключа успешно.

    sortedInsert(Node *root, int key){};
    int main(){
        Node *root = &a;
        sortedInsert(root, 4);
    }
    
  2. За двоично дърво

2.1. От урока (двоен показалец)

    void insert_Tree(Tree **root, int key){
    }

    int main(){  
        Tree *root = NULL;
        insert_Tree(&root, 10);
    }

2.2. това, което направих, е по-долу и не успях да вмъкна ключа, когато проверих възела след вмъкването, възелът все още е нулев. (единичен указател)

    void insert_Tree(Tree *root, int key){
        if(root == NULL){
        root = (Tree *)malloc(sizeof(Tree));
        root->val = key;
        root->left = NULL;
        root->right = NULL;
        cout<<"insert data "<<key<<endl;
    }else if(key< root->val){
        insert_Tree(root->left, key);
        cout<<"go left"<<endl;
    }else{
        insert_Tree(root->right, key);
        cout<<"go right"<<endl;
    }
    }
    int main(){  
        Tree *root = NULL;
        insert_Tree(root, 10);
    }

имам няколко въпроса

1). кое е правилно, 1.1/2.1 двоен показалец или 1.2/2.2 единичен показалец? Моля, обяснете подробно, може да е по-добре, ако можете да покажете пример, мисля, че и двамата са прави.

2). Защо вмъкнах ключ успешно в свързания списък с един указател, но не успях при вмъкването на дърво с един указател?

Благодаря много, оценявам помощта на всички.


person hellocoding    schedule 23.08.2013    source източник


Отговори (2)


Подозирам, че сте имали късмет с теста за свързан списък. Опитайте да вмъкнете нещо в началото на списъка.

За да разширя това...

main() има указател към началото на списъка, който предава по стойност във вашата версия на sortedInsert(). Ако sortedInsert() се вмъкне в средата или края на списъка, няма проблем, главата не се променя и когато се върне към main(), главата е същата. Въпреки това, ако вашата версия на sortedInsert() трябва да вмъкне нова глава, добре, тя може да направи това, но как връща информацията за новата глава обратно в main()? Не може, когато се върне към main() main все още ще сочи към старата глава.

Предаването на указател към копието на главния указател на main() позволява на sortedInsert() да промени стойността си, ако трябва.

person Adam Burry    schedule 23.08.2013
comment
Здравей Адам, можеш ли да ми кажеш защо трябва да използваме указател към указател, а не указател? Указателят също задава или получава стойността по адрес, така че трябва да запази всички промени, нали? - person hellocoding; 27.08.2013

и двата ви подхода са правилни. Но когато сте използвали един указател, указателят на главата ви не се актуализира. Всичко, което трябва да направите, е да върнете новата глава, като напишете „връщане на глава;“ в края на вашата функция,

person SynAck    schedule 14.10.2016