数据结构 中序非递归遍历 代码出错

源代码 及错误如下

#include<stdio.h>
#include<stdlib.h>
typedef int TElemType ;
#define ERROR 0;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define Status int
//定义栈 
typedef struct {
int *base;
int *top;
int stacksize;
}SqStack;
//二叉链表存储表示 
typedef struct BiTNode{
	int data;
	struct BiTNode *lchild,*rchild;//左右孩子指针 
}BiTNode,*BiTree;
//构造空栈
int initstack (SqStack &s){
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return 0;}
//判断是否为空
Status StackEmpty(SqStack S){
    if(S.top==S.base) return 1;
    return 0;}
//先序遍历创建二叉树 
BiTree creatbitree(){
	BiTree T;
	TElemType ch;
	scanf("%c",&ch);
	if(ch=='#') T=NULL;//#代表空格字符 
	else{
		T=(BiTNode*)malloc(sizeof(BiTNode));
		T->data=ch;//生成根结点 
		T->lchild=creatbitree();//生成左子树 
		T->rchild=creatbitree();//生成右子树 
	}
	return T; 	}
//入栈 
Status push(SqStack &s, int &e) 
{
if((s.top-s.base)>=s.stacksize){
s.base=(int*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
		  if(!(s.base))
		 exit(1);
		s.top=s.base+s.stacksize;
		s.stacksize+=STACKINCREMENT;
	   }
	   *s.top++=e;
	   return 0; }
//出栈 
Status pop(SqStack &s,int &e){
	  if(s.top==s.base)
	  return 1;
	  e=*--s.top;
	  return 0;}
//中序非递归遍历的
Status inorder(BiTree T,Status (*visit)(TElemType)){
	SqStack s;
	initstack(s);
	BiTree p=T;
	while(p||!StackEmpty(s)){
	if(p){
		push(s,p);
		p=p->lchild;}
	else{
		pop(s,p);
		if(!visit(p->data)) return 0;
		p=p->rchild;}}
return OK;} 
Status PrintElement(TElemType e){
    printf("%d",e);                             
    return 0;}
int main(){
	BiTree T;
	printf("请按照先序遍历输入二叉树(#代表空子树):\n");
	T=creatbitree();
	printf("二叉树创建成功!\n"); 
	printf("\n中序非递归遍历:\n");
	inorder(T,PrintElement);
	return 0;}

 第70行push(s,p);种p是BiTree类型,你应该传参的是p.data


 

push函数无法将参数 2 从“BiTree”转换为“int &”,望采纳,不懂的可以关注私信我。
 

//二叉树节点定义 
typedef struct BiTreeNode{
	int data;
	struct BiTreeNode *lchild, *rchild;//左右孩子指针 
}BiTreeNode, *pBiTreeNode;

//定义栈
typedef struct {
	pBiTreeNode *stack;
	int top;
	int stacksize;
}MyStack;

//初始化栈
void initstack(MyStack *_s,int _stacksize)
{
	//1.初始化栈内部变量
	_s->stacksize = _stacksize;
	_s->top = -1;
	//2.申请内存空间
	_s->stack = (pBiTreeNode*)malloc(sizeof(pBiTreeNode)*(_s->stacksize));
}

//判断栈是否为空
Status StackEmpty(MyStack *_s)
{
	if (_s->top < 0) return 1;
	return 0;
}
//栈的push操作
void StackPush(MyStack *_s, pBiTreeNode _pdata)
{
	if (_s->top == _s->stacksize - 1)
		//栈满了
		exit(1);
	else{
		_s->stack[++(_s->top)] = _pdata;
	}
}
//栈的top操作:返回栈顶指针
pBiTreeNode StackTop(MyStack *_s)
{
	if (StackEmpty(_s) == 1)
		//栈为空
		exit(1);
	else{
		return _s->stack[_s->top];
	}
}
//栈的pop操作:删除栈顶数据
void StackPop(MyStack *_s)
{
	if (StackEmpty(_s) == 1)
		//栈为空
		exit(1);
	else{
		//free(_s->stack[_s->top]);//释放内存
		_s->top--;
	}
}


//中序非递归遍历的
Status inorder(pBiTreeNode root, Status(*visit)(TElemType)){
	MyStack s;
	initstack(&s,10);
	pBiTreeNode current = root;

	if (current == nullptr) return 0;

	while (current || !StackEmpty(&s)){
		if (current){
			StackPush(&s, current);
			current = current->lchild;
		}
		else{
			current = StackTop(&s);
			StackPop(&s);

			visit(current->data);//打印数据
			current = current->rchild;
		}
	}
	return OK;
}
Status PrintElement(TElemType e){
	printf("%d", e);
	return 0;
}

这是我重新做的,creatbitree();函数我没用,我自己生成了一个固定的树,测试通过