如LinkNode**p,里面存放的是LinkNode*p的地址,LinkNode*p里面存放了一个地址,这个地址存放了一个变量
如
LinkNode**p;
**p=10;
LinkNode**p是一个指针变量,里面存放的一个指针变量的地址,如2000(当然,这2000就是双重指针,前面有篇讲过,变量的地址就是指针,注意指针和指针变量的区别),通过这个2000,我们可以找到LinkNode*p,LinkNode*p中存放了一个地址,如1000,1000这个地址存放了变量10,就是这样。
更形象一点 我的一张纸(LinkNode**p),上写有书架上了第二格5本(地址2000),通过这个地址,我们可以找到第二格第5本的一本比如笔记本(LinkNode*p),笔记本上写了龙湖水晶郦城16幢9-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();
}