#include <stdio.h>
#include <stdlib.h>
/*
A
B C
D
E
*/
typedef struct BTNode
{
int data;
struct BTNode * pLeftChild;
struct BTNode * pRightChild;
}BTNODE, *PBTNODE;
PBTNODE createBTree(void);
//先序遍历,其他的一样
void showPreTree(PBTNODE);
int main(void) {
PBTNODE pTree = createBTree();
showPreTree(pTree);
return 0;
}
void showPreTree(PBTNODE pTree)
{
if (pTree != NULL) {
printf("%c\n", pTree->data);
if (pTree->pLeftChild != NULL) {
showPreTree(pTree->pLeftChild);
}
if (pTree->pRightChild != NULL) {
showPreTree(pTree->pRightChild);
}
}
}
PBTNODE createBTree(void)
{
//创建5个d节点
PBTNODE PNodeA = (BTNODE *)malloc(sizeof(BTNODE));
PBTNODE PNodeB = (BTNODE *)malloc(sizeof(BTNODE));
PBTNODE PNodeC = (BTNODE *)malloc(sizeof(BTNODE));
PBTNODE PNodeD = (BTNODE *)malloc(sizeof(BTNODE));
PBTNODE PNodeE = (BTNODE *)malloc(sizeof(BTNODE));
if (PNodeA == NULL || PNodeB == NULL || PNodeC == NULL || PNodeD == NULL || PNodeE == NULL) {
printf("分配空间失败\n");
exit(-1);
}
PNodeA->data = 'A';
PNodeB->data = 'B';
PNodeC->data = 'C';
PNodeD->data = 'D';
PNodeE->data = 'E';
PNodeA->pLeftChild = PNodeB;
PNodeA->pRightChild = PNodeC;
PNodeB->pLeftChild = NULL;
PNodeB->pRightChild = NULL;
PNodeC->pLeftChild = PNodeD;
PNodeC->pRightChild = NULL;
PNodeD->pLeftChild = NULL;
PNodeD->pRightChild = PNodeE;
PNodeE->pLeftChild = NULL;
PNodeE->pRightChild = NULL;
return PNodeA;
}
C语言二叉树链式创建时,为什么传入的是指针的指针?
在学习数据结构中,有关于二叉树的建立与遍历中,有如此程序:
#include <stdio.h>
#include <mm_malloc.h>
typedef struct Node
{
char data;
struct Node * lChild;
struct Node * rChild;
}BTREE, *PBTREE;//建立全部大写
void preTraverseBTree(PBTREE pTree);
void createBTree(PBTREE * qTree)
{
//qTree是struct Node **类型
//*qTree是struct Node *类型
char data;
scanf("%c", &data);
if (' ' == data) {
*qTree = NULL;//*qTree 等价于struct Node *类型
}else
{
*qTree = (PBTREE)malloc(sizeof(BTREE));
(*qTree)->data = data;
createBTree(&((*qTree)->lChild));
createBTree(&((*qTree)->rChild));
}
return;
}
int main(void)
{
PBTREE pTree = NULL;
createBTree(&pTree);//这个地方传入的是指针的指针,才能修改指针T的值
//createBTree(pTree);//如果是这样,传入的是指针,只能改变*pTree即struct Node的值,并不能够改变pTree(struct Node *)的值
preTraverseBTree(pTree);
return 0;
}
void preTraverseBTree(PBTREE pTree)
{
if (pTree != NULL)
{
printf("%c ", pTree->data);
preTraverseBTree(pTree->lChild);
preTraverseBTree(pTree->rChild);
}
return;
}
其中,在创建二叉树的时候,传入的形参是PBTREE *
类型的,一开始以为应该把*号去掉,直接传指针PBTREE(struct Node *)
就可以了,但是,这样的话,函数createBTree
只能够修改struct Node
的值,而并不能够修改PBTREE(struct Node *)
本身的值,因此,需要传入指针的指针,才可以在createBTree
函数内部修改PBTREE(struct Node *)
的值。