程序仔细看了一下。
关键点是在层遍历的处理上,有一点点小问题。
应该是先压入当前树结点的左右子树,再弹出当前结点。
你却是先弹出了,那还结点都释放了,那里还有结点的左右子树呢?
修改如下,供参考:
#include
#include
/*树结点结构体*/
struct tree{
char data;
struct tree *lchild,*rchild;
};
/*队列*/
struct queue{
struct tree *elem;
struct queue *next;
};
/*队列信息表*/
struct queuenode{
struct queue *front,*rear;
};
/*初始化队列信息表*/
struct queuenode *init(struct queuenode *s){
s=(struct queuenode *)malloc(sizeof(struct queuenode));
s->front=(struct queue*)malloc(sizeof(struct queue));
/*s->rear=(struct queue*)malloc(sizeof(struct queue)); 这个是多余的*/
s->rear=s->front;
s->rear->next=NULL;
return s;
}
/*入队*/
void in_queue(struct queuenode *s,struct tree *ch){
struct queue *p;
p=(struct queue*)malloc(sizeof(struct queue));
p->elem=ch;
p->next=NULL;
s->rear->next=p;
s->rear=p;
}
/*出队*/
void out_queue(struct queuenode *s){
struct queue *p;
if(s->front->next!=NULL){
p=s->front->next;
printf("%2c",p->elem->data);
s->front->next=p->next;
if(s->front->next==NULL)
s->rear=s->front;
free(p);
}
}
/*建立树*/
struct tree *create(struct tree *tree){
char ch;
scanf(" %c",&ch);
if(ch=='#')
tree=NULL;
else{
tree=(struct tree *)malloc(sizeof(struct tree));
tree->data=ch;
tree->lchild=create(tree->lchild);
tree->rchild=create(tree->rchild);
}
return tree;
}
/*层遍历*/
void levelorder(struct tree *tree){
struct queuenode *s;
/*这一段没有用
struct tree *a[100];
int rear=0,front=0;
*/
s=init(s);
if(tree){
in_queue(s,tree); /*先插入一个结点*/
while(s->front->next!=NULL){
if(s->front->next->elem->lchild) /*应先插入当前结点的左右子结点*/
in_queue(s,s->front->next->elem->lchild);
if(s->front->next->elem->rchild)
in_queue(s,s->front->next->elem->rchild);
out_queue(s);/*弹出当前结点*/
}
}
}
void main(){
struct tree *t;
printf("输入节点值(按照先序遍历输入)");
t=create(t);
printf("按层遍历(队列):");
levelorder(t);
}
测试用数据:124##5##36##7##
输出: 1 2 3 4 5 6 7
错误多的很啊,你的create函数有问题。里面使用了一个tree变量,但是这个名称已经用于struct tree类型.你把create函数和insert函数混淆了。同时输入函数有问题。
应该写一个input(struct tree * p)用来输入值,tree * create(void)用来创建新链表,insert(struct tree * p)函数用来在链表中插入新成员.
你题目也没给我不知道你想干什么.