混乱了,结构体的指针变量,指针参数
#include <stdio.h>#include <stdlib.h>
typedef char ElemType;
// 线索存储标志位
// Link(0):表示指向左右孩子的指针
// Thread(1):表示指向前驱后继的线索
typedef enum {Link, Thread} PointerTag;
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild, *rchild;
PointerTag ltag;
PointerTag rtag;
} BiThrNode, *BiThrTree;
// 全局变量,始终指向刚刚访问过的结点
BiThrTree pre;
// 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiThrTree( BiThrTree *T )
{
char c;
scanf("%c", &c);
if( ' ' == c )
{
*T = NULL;
}
else
{
*T = (BiThrNode *)malloc(sizeof(BiThrNode));
(*T)->data = c;
(*T)->ltag = Link;
(*T)->rtag = Link;
CreateBiThrTree(&(*T)->lchild);
CreateBiThrTree(&(*T)->rchild);
}
}
// 中序遍历线索化
void InThreading(BiThrTree T)
{
if( T )
{
InThreading( T->lchild ); // 递归左孩子线索化
if( !T->lchild ) // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。
{
T->ltag = Thread;
T->lchild = pre;
}
if( !pre->rchild )
{
pre->rtag = Thread;
pre->rchild = T;
}
pre = T;
InThreading( T->rchild ); // 递归右孩子线索化
}
}
void InOrderThreading( BiThrTree *p, BiThrTree T )
{
*p = (BiThrTree)malloc(sizeof(BiThrNode));
(*p)->ltag = Link;
(*p)->rtag = Thread;
(*p)->rchild = *p;
if( !T )
{
(*p)->lchild = *p;
}
else
{
(*p)->lchild = T;
pre = *p;
InThreading(T);
pre->rchild = *p;
pre->rtag = Thread;
(*p)->rchild = pre;
}
}
void visit( char c )
{
printf("%c", c);
}
// 中序遍历二叉树,非递归
void InOrderTraverse( BiThrTree T )
{
BiThrTree p;
p = T->lchild;
while( p != T )
{
while( p->ltag == Link )
{
p = p->lchild;
}
visit(p->data);
while( p->rtag == Thread && p->rchild != T )
{
p = p->rchild;
visit(p->data);
}
p = p->rchild;
}
}
int main()
{
BiThrTree P, T = NULL;
CreateBiThrTree( &T );
InOrderThreading( &P, T );
printf("中序遍历输出结果为: ");
InOrderTraverse( P );
printf("\n");
return 0;
}
请教一下:红色处为什么这样传参,混乱了,谁给我透彻的讲讲(对于基本的指针,我还是能理解的,但是这地方有点不懂)
一个BiThrNode结构体为一个结点
BiThrTree *p 是指向结构体指针的指针 是指向树的指针
BiThrTreep 是指向树的第一个结点的指针 是树的头指针 可以用来代表树
用第一种方法作为形参的目的是可以修改树的内容。 BiThrTree *p, BiThrTree T,
前一个时指向指针的指针,用于引用或修改该指针指向的指针的值(也就是它指向的内容)
后一个时指针,用于引用或修改指针的值(也就是它指向的内容)
总之一句话,针对的对象不同,要修改指针的内容,使用指针指向的指针,修改内容,使用指针
BiThrTree *p, BiThrTree T
BiThrTree *p,是BiThrTree 类型的指针
BiThrTree T 是BiThrTree 类型
而BiThrTree 你定义是typedef struct BiThrNode{};BiThrNode, *BiThrTree;
BiThrTree 就相当于struct BiThrNode* sidfate 发表于 2014-4-29 18:51 static/image/common/back.gif
一个BiThrNode结构体为一个结点
BiThrTree *p 是指向结构体指针的指针 是指向树的指针
我怎么觉得第二种方法作为形参也可以修改树的内容,只是无法改变这棵树在内存的地址 码农 发表于 2014-4-30 17:03 static/image/common/back.gif
我怎么觉得第二种方法作为形参也可以修改树的内容,只是无法改变这棵树在内存的地址
我当时也对这玩意混乱了,我的方法是在用 BiThrTree *p 的地方用 BiThrTree p 替换,试着试着就懂了,在下用言语确实无法说得太清楚,重在实践领悟。 sidfate 发表于 2014-4-29 18:51 static/image/common/back.gif
一个BiThrNode结构体为一个结点
BiThrTree *p 是指向结构体指针的指针 是指向树的指针
太长了,看不下去了 {:1_1:}
页:
[1]