|
我昨天看了一下图的广度优先遍历,就想用这个方法建立一棵树,主要其中用到了队列的(有点不同),结果程序没有调成。。希望大家帮一下。。
下面是我的源程序。。。
//tree.h是树的头文件,里面定义了树的结点类型binode和指向结点的指针bitree
//用的是链式存储结构
//queue.h
//里面定义了队列的结构,一个head和rear,分别指向队列的头和尾
//create_b.c
/*
里面定义了两个函数create_bi_tree_queue() is used to create a binary tree,下面是函数bitree createnode(void)用于创建一个结点,返回结点地址。
它被上面的create_bi_tree_queue() 调用。
*/
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//queue.c
/*
这里面实现了队列的操作。。它用到了队列的思想,但是他的enqueue()和dequeue()并没有申请空间!!!!(因为结点已经存在!!(创建树时申请了))
在这里用结点的rchild指针域充当next域
*/
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//main_tes.c
//用于驱动函数。。
//tree.h
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct bitreenode{
int data;
struct bitreenode* lchild;
struct bitreenode* rchild;
}binode , *bitree;
//queue.h
/*************************************************
queue.h is used to declare the data structue type
***************************************************/
#include "tree.h"
typedef struct {
bitree head;
bitree rear;
}queue;
//queue.c
/***************************************************
queue.c is to give the pro of a queue
Witer:Longwen Date:01/06/04
***************************************************/
#include "queue.h"
#include "tree.h"
//initqueue()
int initqueue(queue *pq)
{
if((pq->head=pq->rear=(bitree)malloc(sizeof(binode))))
return 0;
pq->head->lchild=pq->head->rchild=NULL;
return 1;
}
//enqueue()
int enqueue(queue *pq,bitree T)
{
pq->rear->rchild=T;
pq->rear=T;
return 1;
}
//emptyqueue()
int emptyqueue(queue q)
{
if(q.rear==q.head)
return 1;
else return 0;
}
//dequeue()
int dequeue(queue *pq,bitree *ppt)
{
if(pq->head==pq->rear)
return 0;
*ppt=pq->head->rchild;
pq->head=pq->head->rchild->rchild;
return 1;
}
//create_b.c
/*********************************************
create_bi_tree_queue() is used to create a binary tree
using a queue data structure.
Writer:Longwen Date:01/06/04
**********************************************/
#include "queue.h"
#include "tree.h"
bitree createnode();
int create_bi_tree_queue(bitree *pT)
{
char ch;
queue q;//queue.h
if(!initqueue(&q))
return 0;//queue.c
if((*pT=createnode())==NULL)
return 1;
else if(!enqueue(&q,*pT))
return 0; //queue.c
while(!emptyqueue(q))//
{
bitree pt;/*used for dequeue*/
if(!dequeue(&q,&pt))
return 0; //queue.c
if((pt->lchild=createnode())!=NULL)
enqueue(&q,pt->lchild);
if((pt->rchild=createnode())!=NULL)
enqueue(&q,pt->rchild);
}
return 1;
}
bitree createnode(void)
{
char ch;
bitree temp;
puts("Is it NULL or not?(Enter blank means NULL!)");
scanf("%s",&ch);
if(ch==' ')
return(NULL);
else
{
if(!(temp=(bitree)malloc(sizeof(binode))))
exit(-1);
printf("Please input the data(a integer):\n");
while(scanf("%d",temp->data)!=1)
fprintf(stderr,"Sorry,I can not recognize.Again.\n");
temp->rchild=temp->lchild=NULL;
return temp;
}
}
//main_tes.c
/*************************************************
Used to dive the other func.
Writer:Longwen Date:01/06/04
************************************************/
#include "queue.c"
#include "create_b.c"
int main()
{
bitree T;
if(!create_bi_tree_queue(&T))
fprintf(stderr,"ERROR IN create_bi_tree_queue()\n");
return 0;
} |
|