我最近遇到了这个代码,用于构建一个队列,使用数组来存储二叉树的节点。
typedef struct node{
int data;
node *left, *right;
}Node;
Node** createQueue(int *front, int *rear)
{
Node **queue = (Node **)malloc(sizeof(Node*)*500);
*front = *rear = 0;
return queue;
}
int main(){
int rear, front;
Node **queue = createQueue(&front, &rear);
return 0;
}
队列形成期间双指针的用途是什么?
这是整个计划的链接:
http://www.geeksforgeeks.org/level-order-tree-traversal/
(方法2)
答案 0 :(得分:1)
如果您有T
类型的对象,例如
T x;
指向对象的指针将具有类型T *
T *px = &x;
在您的示例中,动态分配了一个500
指针数组,指向Node
类型的对象。也就是说,数组的每个元素都有Node *
类型。
Node **queue = (Node **)malloc(sizeof(Node*)*500);
函数malloc返回数组第一个元素的地址。
由于动态分配数组的每个元素都具有类型Node *
,因此指向数组的指针的指针将具有类型Node **
。
你可以通过以下方式想象它
typedef Node * T;
T *queue = ( T *)malloc( sizeof( T ) * 500 );
因此,如果您将T
替换为Node *
,您将获得
T *queue = ( T *)malloc( sizeof( T ) * 500 );
Node * *queue = ( Node * *)malloc( sizeof( Node * ) * 500 );
答案 1 :(得分:0)
"双指针"是"指向指针"的指针,从提供的摘录中很难说出为什么程序员决定他/她需要这样的结构。
可能是某些需要遍历整个树的任务,但不关心它的树状结构,所以这有助于避免递归(我的意思是可能需要修改这些,以便简单遍历单个 - 指针就足够了)