指针vs链接列表和二叉树的双指针

时间:2013-08-23 07:57:11

标签: pointers linked-list binary-tree insertion double-pointer

  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. 对于二进制树

  3. 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)。为什么我使用单指针成功地在链表中插入密钥,但是我在单个指针的树插入中失败了?

    非常感谢,感谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

我怀疑你的链表测试很幸运。尝试在列表的顶部插入一些东西。

要扩展...

main()有一个指向列表头部的指针,它通过值传递给您的sortedInsert()版本。如果sortedInsert()插入到列表的中间或末尾,那么没有问题,磁头没有改变,当它返回main()时,磁头是相同的。但是,如果您的sortedInsert()版本必须插入一个新头,那么它可以做到这一点,但它如何将有关新头的信息返回给main()?它不能,当它返回main()时仍然会指向旧头。

将指针传递给main()的头指针副本允许sortedInsert()在必要时更改其值。

答案 1 :(得分:0)

你的方法都是正确的。但是你使用单个指针的地方,你的头指针没有被更新。你需要做的就是通过写'return head;'来返回新的头部。在你的功能结束时,