C语言实现树结构

来源:互联网 发布:linux源代码分析博客 编辑:程序博客网 时间:2024/04/29 09:02

#define ERROR -2
#define OK 1
#define true 1
#define false 0
#define NULL 0
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define Status int
#define TElemtype char
#define StackElem BiTNode
#define MAX_TREE_SIZE 100
#include <stdio.h>
typedef struct BiTNode{
 TElemtype data;
 struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct{
StackElem *base;
StackElem *top;
int stacksize;
}SqStack;

int InitStack(SqStack *S)
{
 (*S).base=(StackElem *)malloc(STACK_INT_SIZE*sizeof(StackElem));
 if(!(*S).base) return ERROR;
 (*S).top=(*S).base;
 (*S).stacksize=STACK_INT_SIZE;
 return OK;
}
int GetTop(SqStack S,StackElem *e)
{if(S.base==S.top)  return ERROR;
 *e=*(S.top-1);/*different from book!*/
 return OK;
}
int Push(SqStack *S,StackElem e)
{
 if((*S).top-(*S).base>=(*S).stacksize){
 (*S).base=(StackElem *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(StackElem));
 if((*S).base)  exit(OVERFLOW);
 (*S).top=(*S).base+(*S).stacksize;
 (*S).stacksize+=STACKINCREMENT;
 }
 *((*S).top)=e;
 (*S).top++;
 return OK;
}
int Pop(SqStack *S,StackElem *e)
{if((*S).top==(*S).base)
   return ERROR;
 --(*S).top;
 *e=*((*S).top);
 return OK;
}

int StackEmpty(SqStack S)
{if(S.top==S.base)
  return true;
 else
  return  false;
}
Status Visit(TElemtype e){ /*the easist VISIT function*/
  printf("%c->",e);
  return OK;
 }/*Visit*/

BiTNode *q;
Status InOrderTraverse(BiTree T)
{SqStack *S;
 S=(SqStack *)malloc(sizeof(SqStack));
 q=(BiTNode *)malloc(sizeof(BiTNode));
 InitStack(S);
 q=T;
 while(q||!StackEmpty(*S))
 { if(q){Push(S,*q);
         q=q->lchild;}
   else{
     Pop(S,q);
     if(!Visit(q->data)) return ERROR;
     q=q->rchild;
   }/*else*/
 }/*while()*/
 return OK;
}/*InOrder VisitTree*/

Status PreOrderTraverse(BiTree T) /* ,Status (*Visit)(TElemType e)) */
{
 if(T){
   if(Visit(T->data))
    if(PreOrderTraverse(T->lchild))
     if(PreOrderTraverse(T->rchild)) return OK;
    return ERROR;
 }/*if(T)*/
 else return OK;
}/*PreOder VisteTree*/

Status PostOrderTraverse(BiTree T)
{
 if(T){
   if(PostOrderTraverse(T->lchild))
    if(PostOrderTraverse(T->rchild))
     if(Visit(T->data)) return OK;
    return ERROR;
 }/*if(T)*/
 else return OK;
}/*PostOder VisteTree*/

Status CreateBiTree(BiTree *T)
{char *ch;
 ch=(char *)malloc(sizeof(char));
 scanf("%c",ch);
 if(*ch==' ') *T=NULL;
 else{
   if(!((*T)=(BiTNode *)malloc(sizeof(BiTNode))))   exit(OVERFLOW);
   (*T)->data=*ch;
   CreateBiTree(&(*T)->lchild);
   CreateBiTree(&(*T)->rchild);
 }/*else*/
 return OK;
}/*CreaTtree*/

main()
{BiTree *myTree;
 myTree=(BiTree *)malloc(sizeof(BiTree));
 clrscr();
 printf("Please input chars:/n");
 CreateBiTree(myTree);

 printf("InOrderTraverse:/n");
 InOrderTraverse(*myTree);
 printf("/n");

 printf("PreOrderTraverse:/n");
 PreOrderTraverse(*myTree);
 printf("/n");

 printf("PostOrderTraverse:/n");
 PostOrderTraverse(*myTree);
 printf("/n");
 printf("Check any button quit the programe!");
 getch();
}
 

原创粉丝点击