主题:这是一个关于线索二叉树的C程序,有点小问题,老是提示未定义修饰符,求指导
这个程序里函数:void InOrderThreading(BiThrTree *Thrt,BiThrTree T)中的
(*Thrt) = (BiThrTree)malloc(sizeof(BiThrNode));出错,
错误信息为:error C2065: 'Thrt' : undeclared identifier
源代码如下:
[code=c]
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
typedef char TElemType;
/** 二叉树的二叉线索存储表示 */
typedef enum{Link,Thread} PointerTag; /* Link(0):指针,Thread(1):线索**/
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre; /** 全局变量,始终指向刚刚访问的结点*/
/** 二叉树的二叉线索存储的基本操作 */
void CreatBiThrTree(BiThrTree *T)
{
/*按先序输入线索二叉树中的结点的值,构造二叉树-**/
TElemType ch;
ch = getchar(); //获取从键盘输入的字符
getchar(); //消除键盘回车屏蔽
if(ch == '#')
*T = NULL;
else
{
*T = (BiThrTree)malloc(sizeof(BiThrNode)); /** 生成根节点(先序)*/
if(!*T)
exit(OVERFLOW); //内存分配失败
(*T)->data = ch; //根节点赋值
CreatBiThrTree(&(*T)->lchild); //递归构造左子树
if((*T)->lchild) //有左孩子
(*T)->LTag = Link; //给左标志赋值(指针)
CreatBiThrTree(&(*T)->rchild); //递归构造右子树
if((*T)->rchild) //有右孩子
(*T)->RTag = Link; //给右标志赋值(指针)
}
}
void InThreading(BiThrTree p)
{ /** 通过中序遍历进行中序线索化,线索化之后pre指向最后一个结点*/
if(p)
{
InThreading(p->lchild); /* 递归左子树线索化 */
if(!p->lchild) /* 没有左孩子*/
{
p->LTag = Thread; /** 左标志为线索(前驱)*/
p->lchild = pre; /** 左孩子指针指向前驱 */
}
if(!pre->rchild) /**前驱没有右孩子*/
{
pre->RTag = Thread; /** 前驱的右标志为线索 */
pre->rchild = p; /** 前驱右孩子指针指向其后继(当前结点p)*/
}
pre = p; /** 保持pre指向p的前驱*/
InThreading(p->rchild); /**递归右子树线索化*/
}
}
void InOrderThreading(BiThrTree *Thrt,BiThrTree T)
{
/** 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点 */
*Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!(*Thrt)) /**生成头结点不成功*/
exit(OVERFLOW);
(*Thrt)->LTag=Link; /**建头结点,左标志为指针*/
(*Thrt)->RTag=Thread; /**右标志为线索*/
(*Thrt)->rchild=*Thrt; /**右指针回指*/
if(!T) /* 若二叉树空,则左指针回指**/
(*Thrt)->lchild=(*Thrt);
else
{
(*Thrt)->lchild=T; /**头结点的指针指向根结点*/
pre=(*Thrt); /** pre(前驱)的初值指向头结点*/
InThreading(T); /** 中序遍历進行中序线索化,pre指向中序遍历的最後一個结点 */
pre->rchild=(*Thrt); /**最后一个结点的右指针指向头结点*/
pre->RTag=Thread; /**最后一个结点的右标志为线索*/
(*Thrt)->rchild=pre; /**头结点的右指针指向中序遍历的最后一个结点*/
}
}
void main()
{
BiThrTree T,Thrt;
CreatBiThrTree(&T);
InOrderThreading(&Thrt,T);
}
[/code]
(*Thrt) = (BiThrTree)malloc(sizeof(BiThrNode));出错,
错误信息为:error C2065: 'Thrt' : undeclared identifier
源代码如下:
[code=c]
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
typedef char TElemType;
/** 二叉树的二叉线索存储表示 */
typedef enum{Link,Thread} PointerTag; /* Link(0):指针,Thread(1):线索**/
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
BiThrTree pre; /** 全局变量,始终指向刚刚访问的结点*/
/** 二叉树的二叉线索存储的基本操作 */
void CreatBiThrTree(BiThrTree *T)
{
/*按先序输入线索二叉树中的结点的值,构造二叉树-**/
TElemType ch;
ch = getchar(); //获取从键盘输入的字符
getchar(); //消除键盘回车屏蔽
if(ch == '#')
*T = NULL;
else
{
*T = (BiThrTree)malloc(sizeof(BiThrNode)); /** 生成根节点(先序)*/
if(!*T)
exit(OVERFLOW); //内存分配失败
(*T)->data = ch; //根节点赋值
CreatBiThrTree(&(*T)->lchild); //递归构造左子树
if((*T)->lchild) //有左孩子
(*T)->LTag = Link; //给左标志赋值(指针)
CreatBiThrTree(&(*T)->rchild); //递归构造右子树
if((*T)->rchild) //有右孩子
(*T)->RTag = Link; //给右标志赋值(指针)
}
}
void InThreading(BiThrTree p)
{ /** 通过中序遍历进行中序线索化,线索化之后pre指向最后一个结点*/
if(p)
{
InThreading(p->lchild); /* 递归左子树线索化 */
if(!p->lchild) /* 没有左孩子*/
{
p->LTag = Thread; /** 左标志为线索(前驱)*/
p->lchild = pre; /** 左孩子指针指向前驱 */
}
if(!pre->rchild) /**前驱没有右孩子*/
{
pre->RTag = Thread; /** 前驱的右标志为线索 */
pre->rchild = p; /** 前驱右孩子指针指向其后继(当前结点p)*/
}
pre = p; /** 保持pre指向p的前驱*/
InThreading(p->rchild); /**递归右子树线索化*/
}
}
void InOrderThreading(BiThrTree *Thrt,BiThrTree T)
{
/** 中序遍历二叉树T,并将其中序线索化,Thrt指向头结点 */
*Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!(*Thrt)) /**生成头结点不成功*/
exit(OVERFLOW);
(*Thrt)->LTag=Link; /**建头结点,左标志为指针*/
(*Thrt)->RTag=Thread; /**右标志为线索*/
(*Thrt)->rchild=*Thrt; /**右指针回指*/
if(!T) /* 若二叉树空,则左指针回指**/
(*Thrt)->lchild=(*Thrt);
else
{
(*Thrt)->lchild=T; /**头结点的指针指向根结点*/
pre=(*Thrt); /** pre(前驱)的初值指向头结点*/
InThreading(T); /** 中序遍历進行中序线索化,pre指向中序遍历的最後一個结点 */
pre->rchild=(*Thrt); /**最后一个结点的右指针指向头结点*/
pre->RTag=Thread; /**最后一个结点的右标志为线索*/
(*Thrt)->rchild=pre; /**头结点的右指针指向中序遍历的最后一个结点*/
}
}
void main()
{
BiThrTree T,Thrt;
CreatBiThrTree(&T);
InOrderThreading(&Thrt,T);
}
[/code]