为什么单个函数能运行,放到整体上就不行???????

实现二叉树管理系统,函数中查找和插入两个函数正确,放到主函数中就运行不出来,是界面的第5.6个功能.求大佬指导.

#include<stdio.h>
#include<string.h>
typedef int elem;
#define max 20

//-------------------------
typedef struct node
{
	elem data;
	node* left;
	node* right;

}node,*Tnode;
typedef struct
{
	elem data[max];
	int front;
	int rear;
	int size;
}queue;
//------------------------
int initqueue(queue &s)
{
	s.front = s.rear = 0;
	s.size = max;
	return 1;

}
int queueempty(queue s)
{
	if (s.front == s.rear)
		return 1;
	else 
		return 0;


}
elem queuehead(queue s)
{
	if (s.front == s.rear)
		return -1;
	else
		return s.data[s.front];

}
int enqueue(queue &s, elem e)
{
	if ((s.rear + 1) % s.size == s.front)
		return 0;
	else
	{   
		
		s.data[s.rear] = e;
		s.rear = (s.rear + 1) % s.size;
		return 1;
	    
	
	}

}
elem dequeue(queue &s)
{
	if (s.front == s.rear)
		return -1;
	else
	{
		elem e=s.data [s.front ];
		s.front = (s.front + 1) % s.size;
		return e;
	
	}


}
void queueplay(queue s)
{
	int p = s.front;
	while (p != s.rear % s.size)
	{
		printf("%d ",s.data [p]);
		p = (p + 1) % s.size;
		
	}
	

}
//----------------------
typedef struct trnode
{
	char data;
	trnode* left;
	trnode* right;
	
}trnode,*Trnode;

//----------------------
typedef struct qnode
{
	Trnode data;
	qnode* left;
	qnode* right;

}qnode,*qTnode;
typedef struct
{
	Trnode data[max];
	int front;
	int rear;
	int size;
}qqueue;
//------------------------
int qqueueempty(qqueue s)
{
	if (s.front == s.rear)
		return 1;
	else 
		return 0;


}
int qinitqueue(qqueue &s)
{
	s.front = s.rear = 0;
	s.size = max;
	return 1;

}


int qenqueue(qqueue &s, Trnode e)
{
	if ((s.rear + 1) % s.size == s.front)
		return 0;
	else
	{   
		
		s.data[s.rear] = e;
		s.rear = (s.rear + 1) % s.size;
		return 1;
	    
	
	}

}
Trnode qdequeue(qqueue &s)
{
	if (s.front == s.rear)
		return NULL;
	else
	{
		Trnode e=s.data [s.front ];
		s.front = (s.front + 1) % s.size;
		return e;
	
	}


}
//--------------------------
typedef struct snode
{
	char data;
	snode* next;
}snode, *Linkstack;
Linkstack init()
{
	Linkstack a;
	a = NULL;
	return a;
}
int push(Linkstack &a, char e)
{
	Linkstack p = new snode;
	p->data = e;
	p->next = a;
	a = p;
	//printf("进栈成功");
	return 1;
}
char gettop(Linkstack a)
{
	char e;
	if (a == NULL)
	{
	//	printf("栈空!");
		return NULL;
	}
	else
	{
		e = a->data;
		return e;
	}


}
int length(Linkstack a)
{
	Linkstack p=a;
	int	i=0;
	while(p)
	{
		p=p->next ;
		i++;
	}
	return i;
}
char pop(Linkstack &a)
{
	char e;
	if(a==NULL)
	{
		//printf("栈空");
		return NULL;
	}
	if(length(a)==1)
	{

		e=a->data ;
		a=NULL;

		//printf("出栈成功");
		return e;
	}
	else
	{
		Linkstack p=a->next ;
		e=a->data ;
		delete a;
		a=p;
		//printf("出栈成功");
		return e;
	}


}
int display(Linkstack a)
{
	Linkstack p = a;
	

	while (p)
	{
		printf("%c ", p->data);
		
		p = p->next;

	}
	return 1;
}
char getbase(Linkstack a)
{
	Linkstack p=a;
	for(int i=1;i<length(a);i++)
	{
		p=p->next ;
	
	}
	return p->data ;
}
//-----------------------------
typedef struct ssnode
{
	Trnode data;
	ssnode* next;
}ssnode, *sLinkstack;
sLinkstack sinit()
{
	sLinkstack a;
	a = NULL;
	return a;
}

int spush(sLinkstack &a, Trnode e)
{
	sLinkstack p = new ssnode;
	p->data = e;
	p->next = a;
	a = p;
	//printf("进栈成功");
	return 1;
}

int slength(sLinkstack a)
{
	sLinkstack p=a;
	int	i=0;
	while(p)
	{
		p=p->next ;
		i++;
	}
	return i;
}
Trnode spop(sLinkstack &a)
{
	Trnode e;
	if(a==NULL)
	{
		//printf("栈空");
		return NULL;
	}
	if(slength(a)==1)
	{

		e=a->data ;
		a=NULL;

		//printf("出栈成功");
		return e;
	}
	else
	{
		sLinkstack p=a->next ;
		e=a->data ;
		delete a;
		a=p;
		//printf("出栈成功");
		return e;
	}


}
int sdisplay(sLinkstack a)
{
	sLinkstack p = a;
	

	while (p)
	{
		printf("%c", p->data);
		
		p = p->next ;

	}
	return 1;
}


//---------------------------
//1.根据字符串创建树(先序)
void crttree(Trnode &T)
{
	char ch;
	scanf("%c",&ch);
	if (ch == '#')
		T = NULL;
	else
	{
		T = new trnode;
		T->data = ch;
		if(T->left )
		crttree(T->left);
		if(T->right )
		crttree(T->right);
	//	printf("1\n");

	}
	


}
//---------------------------------
//2.先序遍历
void preorder(Trnode s)
{
	if (s)
	{
		printf("%c ",s->data );
		preorder(s->left);
		preorder(s->right);
	}

}
//----------------------------------
//0.1用先序和中序创建二叉树
Trnode createtree(char a[],char b[],int i,int j,int len)
{
	Trnode root=new trnode;
	if(len<=0)
		return NULL;
	else
	{
		root->data =a[i];
		char *p=b;
		for(p=b;p!=NULL;p++)
		{
			if(*p==a[i])
				break;	
		}
		int m=p-b;
		root->left =createtree(a,b,i+1,j,m-j);
		root->right =createtree(a,b,i+(m-j)+1,m+1,len-1-(m-j));
		return root;	
	}
}
//------------------------------------
//0.2计算树的深度/高度
int length(Trnode s)
{
	if(s==NULL)
		return 0;
	else if(s->left==NULL&&s->right==NULL)
		return 1;
	else
	{
		int m=length(s->left );
		int n=length(s->right );
		if(m<=n)
			return n+1;
		else 
			return m+1;
	}
}
//----------------------------------
//0.3一次输出
void putnode(Trnode a)
{
	int len;

	
	if (a->left == NULL && a->right == NULL) {
		len = 1;
	}
	else
	{
		len = length(a->left) + length(a->right);
	}
	
	for (int i = 1; i <= len; i++)
	{
		printf("%c", a->data);
	}
	printf("\n");
}
//-------------------------------------------------
//5.查找指定节点并返回其指针
Trnode find(Trnode s, char a)
{
	Trnode h;
	if (s)
	{
		if (a == s->data) 
		{
			return s;
		}
		h = find(s->left, a);   
		if (h != NULL) 
		{    
			return h;
		}
		else 
		{
			return find(s->right, a);
		}
	}
	else 
	{
		return NULL;
	}
}
//------------------------------------------
//4. 层次遍历
void layer(Trnode s)
{
	qqueue q;
	qinitqueue(q);
	if(s)
		qenqueue(q,s);
	while(!qqueueempty(q))
	{
		Trnode p;
		p=qdequeue(q);
		printf("%c",p->data);
		if(p->left)
			qenqueue(q,p->left);
		if(p->right)
			qenqueue(q,p->right);
	}
}
//------------------------------------------
//0.4计算节点的深度
int depthnode(Trnode s,Trnode e)
{
	
	if(s==NULL)
		return 0;
	if(s->data ==e->data )
		return 1;
	int l=depthnode(s->left ,e);
	int r=depthnode(s->right ,e);
	if(l||r)
	{
		if(l>r)
			return l+1;
		else
			return r+1;
	
	
	}
	return -1;
}


//3.凹入输出
//----------------------------------------------------
//3.1
void ao(char a[],char b[])
{
	int n=strlen(a);
	Trnode s=createtree(a,b,0,0,n);//创建二叉树
	
	for(int i=0;i<n;i++)
	{
		Trnode e=find(s,a[i]);
		putnode(e);
		
	}
}
//---------------------------------
//3.2课本
void aoo(Trnode t,int level)
{
	int i,k;
	if(t)
	{
		for(i=1;i<level;i++)
			putchar(' ');
		printf("%c",t->data );
		for(k=i+4;k<20;k++)
			putchar('-');
		putchar('\n');
		aoo(t->left ,level+2);
		aoo(t->right ,level+2);
	}
}
//----------------------------------------------
//0.5输出空格
void kong(Trnode s,Trnode a)
{
	int len=depthnode(s,a);
	for(int i=0;i<len-1;i++)
	{
		printf(" ");
	}
	printf("%c\n",a->data );


}
//3.3
//---------------------------------------
void aooo(char a[],char b[])
{
	int n=strlen(a);
	Trnode s=createtree(a,b,0,0,n);//创建二叉树
	for(int i=0;i<n;i++)
	{
		Trnode e=find(s,b[i]);
		kong(s,e);
		
	}
}
//----------------------------------------------
//6.插入节点
int insertnode(Trnode &s,char a,int lrflag,char p)//二叉树,插入节点的双亲,插入节点是其左孩子/右孩子,插入节点
{
	Trnode e=find(s,a);
	Trnode q=new trnode;
	if(!q)
		return 0;
	else
	{

	q->data =p;
	q->left =q->right =NULL;
	Trnode m=e->left ;
	Trnode n=e->right ;
	if(lrflag==1)//左孩子
	{
		q->left =m;
		e->left =q;	
	}
	else
	{
		q->right =m;
		e->right =q;	
	
	}
	printf("插入成功");
	return 1;
	}


}


//----------------------------------
//8.复制二叉树
Trnode copy(Trnode s)
{
	if(s==NULL)
	{
		return NULL;
	}
	else
	{
		Trnode e=new trnode;
		e->data =s->data ;
		if(s->left )
			e->left =copy(s->left );
		else
			e->left =NULL;
		if(s->right)
			e->right =copy(s->right );
		else
			e->right =NULL;
		return e;	
	}
}


//-------------------------------------

//0.7找双亲
Trnode parent(Trnode s, Trnode a)
{
	Trnode h;
	if (s)
	{
		if (a == s->left||a==s->right) 
		{
			return s;
		}
		h = parent(s->left, a);   
		if (h != NULL) 
		{    
			return h;
		}
		else 
		{
			return parent(s->right, a);
		}
	}
	else 
	{
		return NULL;
	}
}
//--------------------------------------------------
//7.删除节点
void deletenode(Trnode &s,char e)
{
	Trnode t=find(s,e);
	Trnode p=parent(s,t);
	if(p==NULL)//根节点
	{
		printf("所删除节点为根节点\n");
		s=NULL;
		t->left=t->right =NULL;
		t=NULL;
		printf("删除成功\n");
		return ;

	
	}
	else//叶子结点和非叶子结点

	{
		if(p->left==t)
		{
			p->left=NULL;
			t->left =t->right =NULL;
			delete t;
	
		}
		if(p->right==t)
		{
			p->right=NULL;
			t->left =t->right =NULL;
			delete t;
		
		}
		printf("删除成功\n");

	}



}
//----------------------------------------------
//9.递归实现输出从根节点到叶子结点的所有路径
//0.8找叶子结点
sLinkstack sa=sinit();//叶子结点
void leaf(Trnode s)
{
	if (s)
	{
		if(!s->left&&!s->right )
		{
			spush(sa,s);		
		}
		leaf(s->left);
		leaf(s->right);
	}

}


//9.输出路径
void road(Trnode s)
{
	while(slength(sa))
	{
	//	printf("1\n");
		Trnode t=spop(sa);
		Trnode p=t;
		sLinkstack x=sinit();
		spush(x,t);
		while(parent(s,p)!=NULL)
		{
			
			spush(x,parent(s,p));
			p=parent(s,p);
		}
		while(slength(x))
		{
			Trnode q=spop(x);
			printf("%c-",q->data);
		//	printf("3\n");
		
		
		}
	//	printf("4\n");
		printf("\n");
	
	}
}


//--------------------------------------
int screen()
{
	printf("---------------------------------------------\n\n");
	printf("              二叉树管理系统(字符串)\n");
	printf("---------------------------------------------\n\n");
//	printf("              1-----先序字符串建立二叉树\n");
	printf("              2-----先序遍历输出\n");
	printf("              3-----凹入输出(三种输出形式)\n");
	printf("              4-----层次遍历输出\n");
	printf("              5-----查找结点\n");
	printf("              6-----插入结点\n");
	printf("              7-----删除结点\n");
	printf("              8-----复制二叉树\n");
	printf("              9-----输出路径\n");
//	printf("              10----找双亲结点\n");
//	printf("              11----计算结点深度\n");
//	printf("              12----用先序和中序创建二叉树\n");
	printf("              0-----退出\n");
//	printf("---------------------------------------------\n");
	printf("              请输入对应数字\n"); 
//	printf("---------------------------------------------\n");
	//int key;
//	scanf("%d",&key);
	return 1;



}

int main()
{
	char a[80];
	char b[80];
	int p;
	Trnode s,cz,za,q,t;
	int n,len,k;
	
	char sc;
	char sq,e,j,z;
	int lrflag;
	printf("请输入先序字符串:\n");
	crttree(t);
	printf("创建成功!\n");
	while(p)
	{
		screen();
		scanf("%d",&p);
		switch(p)
		{		
		case 2:

			preorder(t);
			break;
		case 3:
			{
				printf("请输入先序字符串:\n");
				scanf("%s",a);
				printf("请输入中序字符串:\n");
				scanf("%s",b);
				if(strlen(a)!=strlen(b))
					printf("输入错误!");
				else
				{
				printf("\n第一种:\n");
				ao(a,b);
				printf("\n第二种:\n");
				n=strlen(a);
				s=createtree(a,b,0,0,n);
				aoo(s,length(s));
				printf("\n第三种:\n");
				aooo(a,b);
				printf("\n输出完毕\n");
				}
				
			}
			break;
		case 4:
			{
				layer(t);
				printf("\n输出完毕\n");
				break;
			}
			//--------------------------------------------
		case 5://查找
			{
				printf("请输入要查找结点的字符值:");
				
				char pp;
				scanf("%c",&pp);
				q=find(t,pp);
				if(q!=NULL)
				{
					printf("已找到\n");
				}
				else
				{
					printf("该结点不存在\n");
				
				}
				break;
			}
		case 6://插入
			printf("请依次输入所插入结点的双亲,属于左孩子/右孩子(1表示左孩子,0表示右孩子),插入的字符值,并用空格隔开:\n");
		
			scanf("%c %d %c",&sq,&lrflag,&e);
			k=insertnode(t,sq,lrflag,e);
			if(k==1)
				printf("插入成功\n");
			else
				printf("插入失败\n");
			break;
		case 7://删除
			printf("请输入所需要删除结点的字符值:\n");
			
			scanf("%c",&sc);
			cz=find(t,sc);
			if(cz==NULL)
				printf("无所需要删除结点\n");
			else
			{
			
			deletenode(t,sc);
			printf("删除成功\n");
			}
			break;
			//---------------------------------------------------------
		case 8:
			copy(t);
			printf("复制成功\n");
			break;
		case 9:
			//路径
			printf("所有路径为:\n");
			leaf(t);
			road(t);
			break;
		case 10://shuangqin
			printf("请输入结点字符值:\n");
			scanf("%c",&z);
			za=parent(t,find(t,z));
			printf("其双亲为%c",za->data );
			break;

		case 11://jisuan jiedian shendu
			printf("请输入结点字符值:\n");
			j;
			scanf("%c",&j);
			len=depthnode(t,find(t,j));
			printf("结点深度为%d\n",len);
			break;
		
		default:printf("输出错误!");
			break;

		
		}	
	
	}

	return 0;
}

 

你看看函数在那里调用了,参数设置和返回值对不对

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

也许对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y