//第一部分头文件及相关存储结构(Head.h)
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
typedef struct CSNode
{
ElemType data ;
struct CSNode *firstchild, *nextsibling;
} CSNode,*CSTree;
typedef CSTree QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//第二部分:队的简单操作(Queue.c)
#include"Head.h"
Status InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));//指向头结点
if(!Q->front) exit(0);
Q->front->next=NULL;
return 1;
}
Status EnQueue (LinkQueue *Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return 1;
}
Status DeQueue (LinkQueue *Q)
{
QueuePtr p;
if(Q->front==Q->rear) return 0;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p) Q->rear=Q->front;
free(p);
return 1;
}
QElemType GetHead(LinkQueue *Q)
{
if(Q->front==Q->rear) return 0;
return Q->front->next->data;
}
Status DestroyQueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
return 1;
}
第三部分:层次建树实现树与二叉树的转化
#include"Queue.c"
//层次遍历建立一棵树(孩子兄弟二叉链表)
CSTree CreateTree()
{
CSTree T,p,r;
int fa,ch;
LinkQueue Q;
int n;
printf("请输入创建树的结点的个数\n");
scanf("%d",&n);
if(n==0) T=NULL;
else
{
InitQueue(&Q);
T=(CSTree)malloc(sizeof(CSNode));
printf("请输入根结点的数据\n");
scanf("%d",&T->data);
T->firstchild=T->nextsibling=NULL;
EnQueue (&Q,T);
for(;n>1;n--)
{
printf("请输入当前结点的父亲数据和自己数据\n");
scanf("%d %d",&fa,&ch);
CSTree s=(CSTree)malloc(sizeof(CSNode));
s->data=ch;s->firstchild=s->nextsibling=NULL;
p=GetHead(&Q);
while(p->data!=fa)
{
DeQueue (&Q);
p=GetHead(&Q);
}
if(!p->firstchild)
{
p->firstchild=s;
r=s;
}
else
{
r->nextsibling=s;
r=s;
}
EnQueue (&Q,s);
}
}
DestroyQueue(&Q);
return T;
}
//树的遍历即孩子兄弟链表的遍历不多赘述
//树的先序遍历即孩子兄弟链表线序遍历
void PreOrderTraverse(CSTree T)
{
if(T)
{
printf("%d ",T->data);
PreOrderTraverse(T->firstchild);
PreOrderTraverse(T->nextsibling);
}
}
//树的后序遍历即孩子兄弟链表中序遍历
void InOrderTraverse(CSTree T)
{
if(T)
{
InOrderTraverse(T->firstchild);
printf("%d ",T->data);
InOrderTraverse(T->nextsibling);
}
}
void main()
{
CSTree T;
T=CreateTree();
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
}