双重指针变量的定义和使用

  双重指针变量也是一个指针变量,只是它存的值是一个指针变量的地址。

LinkNode**p,里面存放的是LinkNode*p的地址,LinkNode*p里面存放了一个地址,这个地址存放了一个变量

LinkNode**p

**p=10

LinkNode**p是一个指针变量,里面存放的一个指针变量的地址,如2000(当然,这2000就是双重指针,前面有篇讲过,变量的地址就是指针,注意指针和指针变量的区别),通过这个2000,我们可以找到LinkNode*pLinkNode*p中存放了一个地址,如10001000这个地址存放了变量10,就是这样。

 

更形象一点  我的一张纸(LinkNode**p),上写有书架上了第二格5本(地址2000),通过这个地址,我们可以找到第二格第5本的一本比如笔记本(LinkNode*p),笔记本上写了龙湖水晶郦城169-2室(地址1000),通过这个地址我可以找到我的朋友(**p,也就是10)。

 

双重指针不是很常使用,但不代表没用

比如你要通过一个函数来改变某个参数的值,恰好这个参数又是指针,所以传值时要传递的应该是这个指针的地址,也就是指针的指针。

 

如在我们才学的二叉树的遍历中,我们就可以用到这点

#include <iostream>

 

#define Max 10

using namespace std;

class BiNode

{

     

   public:

         char data;

     BiNode *lchild, *rchild;

     BiNode()

         {

             lchild = NULL;

             rchild = NULL;

         }

};

class BiTree

{    

         char a[Max];

  public:

          BiNode * root;

     BiTree()

         {

                   for(int i = 0;i < 10;i++)

                   {

                         cin>>a[i];

                   }

                   create(&root,0);

         } 

         void create(BiNode **p,int i)

         {

                  if (a[i] == '#') return;

                    if (i >= 10) return;

          BiNode * temp = new BiNode;

                    temp->data = a[i];

                    *p = temp;

                    create (&(*p)->lchild, 2*(i+1)-1);

          create (&(*p)->rchild, 2*(i+1));

         }

 

         int nodeNum(BiNode *p)

         {

         if (p == NULL) return 0;

                   if (p->lchild == NULL && p->rchild == NULL) return 1;

                   return (nodeNum(p->lchild) + nodeNum(p->rchild) + 1);

        

         }

         int depth(BiNode *p)

         {

         if (p == NULL) return 0;

                   if (p->lchild == NULL && p->rchild == NULL) return 1;

                   return depth(p->lchild) > depth(p->rchild)? depth(p->lchild) +1: depth(p->rchild) +1;

         }

         int leafNum(BiNode *p)

         {   static i=0;

         if (p == NULL) return 0;

                   if (p->lchild == NULL && p->rchild == NULL) i++;

                   leafNum(p->lchild);

                   leafNum(p->rchild);

                   return i;

         }

         

     

     void preOrder()

     {

                   cout<<"前序:";

        preOrder_aux(root);

                   cout<<endl<<"中序:";

                   preOrder_min(root);

                   cout<<endl<<"后序:";

                   preOrder_beh(root);

     }

     

     void preOrder_aux(BiNode* p)

     {

         if (p != NULL)

         {

               cout<<p->data;

               preOrder_aux(p->lchild);

               preOrder_aux(p->rchild);

         }

     }

         void preOrder_min(BiNode* p)

     {

         if (p != NULL)

         {

                              preOrder_min(p->lchild);

               cout<<p->data;

               preOrder_min(p->rchild);

         }

     }

         void preOrder_beh(BiNode* p)

     {

         if (p != NULL)

         {

               preOrder_beh(p->lchild);

               preOrder_beh(p->rchild);

                                    cout<<p->data;

         }

     }

};

void main()

{

        BiTree a;

        cout<<"结点个数"<<a.nodeNum(a.root)<<endl;

        cout<<"深度"<<a.depth(a.root)<<endl;

        cout<<"叶子数"<<a.leafNum(a.root)<<endl;

        a.preOrder();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值