2020-11-21

为什么我的程序执行到一半,它就显示按任意键退出。
谢谢,这个困惑我两个星期了,我实在不知道怎么解决,拜托了

//利用顺序储存方式的队列;创建和遍历 层序二叉树  
#include <stdio.h>
#include <stdlib.h>
#define elementtype int
struct bintree
{
	bintree* left;
	bintree* right;
	elementtype data;
};
typedef struct bintree bintree;

struct queue//顺序存储方式 的队列结构体 
{
	bintree** DATA;
	int front;
	int rear;
	int maxsize;
};
typedef struct queue queue;

queue* creatqueue(int n);
bool insertqueue(queue* Q,bintree* x);
bintree* outputqueue(queue* Q);
void display(queue* Q);
bintree* creatbintree();
void level_order_traversal(bintree* BT);

int main()
{
	bintree* BT=creatbintree();
	level_order_traversal(BT);
}

queue* creatqueue(int n)//创建空队列
{
	queue* Q=(queue*)malloc(sizeof(queue));
	Q->DATA=(bintree**)malloc(sizeof(bintree*));
	Q->front=Q->rear=0;
	Q->maxsize=n;
	return Q;
}

bool insertqueue(queue* Q,bintree* x)//入队列 
{
	if((Q->rear+1)%Q->maxsize==Q->front)
	{
		printf("队列已满!");
		return false;
	}
	else 
	{
		Q->rear=(Q->rear+1)%Q->maxsize;
		Q->DATA[Q->rear]=x;
		return true;
	}
}

bintree* outputqueue(queue* Q)//出队列 
{
	bintree* t;
	if(Q->rear%Q->maxsize==Q->front) 
	{
		printf("队列为空!"); 
		return NULL;
	}
	else
	{
		
		Q->front=(Q->front+1)%Q->maxsize;
		t=Q->DATA[Q->front];
		return t;
	} 
}

void display(queue* Q)//展示队列内的数据
{
	int i=Q->front+1;
	while(i%Q->maxsize!=Q->rear%Q->maxsize )
	{
		i=i%Q->maxsize; 
		printf("%d",Q->DATA[i]->data);
		i++;
	}
	printf("%d\n",Q->DATA[Q->rear]->data);
}

bintree* creatbintree()//创建层序二叉树 
{
	bintree* BT,*T;
	queue* Q=creatqueue(20);
	elementtype x;
	scanf("%d",&x);//根节点 
	if(x!=0) //根结点为0则二叉树为空 
	{
		BT=(bintree*)malloc(sizeof(bintree));
		BT->data=x;
		BT->left=BT->right=NULL;
		insertqueue(Q,BT);//根结点入队列 
	}
	else return NULL;
	
	while(Q)//队列不为空则还有子结点 
	{
		T=outputqueue(Q);//按层序方式,结点出队列 
		printf("删除的数是:%d\n",T->data);
		scanf("%d",&x);//输入该结点左孩子 
		if(x==0) T->left=NULL;
		else
		{
			T->left=(bintree*)malloc(sizeof(bintree));
			T->left->data=x;
			T->left->left=T->left->right=NULL;
			insertqueue(Q,T->left);
		}
		printf("这个数的左孩子是:%d\n",T->left->data);
		scanf("%d",&x);//输入该结点右孩子 
		if(x==0) T->right=NULL;
		else
		{
			T->right=(bintree*)malloc(sizeof(bintree));
			T->right->data=x;
			T->right->left=T->right->right=NULL;
			insertqueue(Q,T->right);
		} 
		printf("这个数的右孩子是:%d\n",T->right->data);
		display(Q);//输出此时队列内的数据 
	}
	return BT;//返回根结点 
}

void level_order_traversal(bintree* BT)//层序递归遍历 
{
	queue* Q=creatqueue(20);
	bintree* T;
	if(!BT) return;
	insertqueue(Q,BT);
	while(Q)
	{
		T=outputqueue(Q);
		printf("%d",T->data);
		if(T->left)  insertqueue(Q,T->left);
		if(T->right) insertqueue(Q,T->right);
	}	
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值