[置顶] 广义表的二叉树的形式

输入二叉树的广义表形式,将其转变为二叉树形式,至于怎样输入广义表需要程序规定。

 

定义包含头文件文件t11.h中

#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h"  //atoi(),exit();
#include"io.h"      //eof()
#include"math.h"


#define  TRUE  1
#define  FALSE  0
#define  OK   1
#define  ERROR 0

typedef int Status;
typedef int Boolean;

定义数据结构头文件gercs.h中

#define INIT_STACK 100
#define INIT_STACK_ADD  20
typedef struct node            //  二叉树的数据结构定义
{
    char data;
 struct node *lchild;
 struct node *rchild;
}*Bitree,pBitree;

typedef struct
{
    char *bottom;
 char *top;
 int stacksize;
}Sqstack;
struct Binode
{
 Bitree lp;
};
struct Sqstack1
{
 Binode *bottom;
 Binode *top;
 int stacksize;
};

typedef struct
{
     Binode *front;
  Binode *rear;
  int queuesize;
}*linkqueue,queue;
 
Sqstack W;

定义包含实现函数功能模块gercs.cpp中

void inittree(Bitree &T)
{
 T=NULL;
}
void initqueue(queue &Q)
{
 Q.front=(Binode*)malloc(INIT_STACK*sizeof(Binode));
 Q.rear=Q.front;
 Q.queuesize=INIT_STACK;
}
void initstack(Sqstack &L)
{
 L.bottom=(char*)malloc(INIT_STACK*sizeof(char));
 if(!L.bottom)
 {
  printf("内存分配失败!!");
  exit(0);
 }
 L.top=L.bottom;
 L.stacksize=INIT_STACK;
 
}
void initstack1(Sqstack1 &L)
{
 L.bottom=(Binode*)malloc(INIT_STACK*sizeof(Binode));
 if(!L.bottom)
 {
  printf("内存分配失败!!");
  exit(0);
 }
 L.top=L.bottom;
 L.stacksize=INIT_STACK;
 
}
void enqueue(queue &Q,Bitree T)
{
 if(Q.rear-Q.front > Q.queuesize)
 {
  Q.front=(Binode*)realloc(Q.front,(Q.queuesize,INIT_STACK_ADD)*sizeof(Binode));
  Q.rear=Q.front+Q.queuesize;
  Q.queuesize+=INIT_STACK_ADD;
 }
 (Q.rear++)->lp=T;
}

void push(Sqstack &L,char ch)
{
    if(L.top-L.bottom > L.stacksize)
 {
  L.bottom=(char*)realloc(L.bottom,(L.stacksize+INIT_STACK_ADD)*sizeof(char));
  L.top=L.bottom+L.stacksize;
  L.stacksize+=INIT_STACK_ADD;
 }
 *(L.top++)=ch;
}

void push1(Sqstack1 &L,Bitree ch)
{
    if(L.top-L.bottom > L.stacksize)
 {
  L.bottom=(Binode*)realloc(L.bottom,(L.stacksize+INIT_STACK_ADD)*sizeof(Binode));
  L.top=L.bottom+L.stacksize;
  L.stacksize+=INIT_STACK_ADD;
 }
 (L.top++)->lp=ch;
}

Status pop(Sqstack &L,char &e)
{
 if(L.bottom == L.top)
  return ERROR;
 else
 {
  e=*(--L.top);
  return OK;
 }
}

Status pop1(Sqstack1 &L,Bitree &e)
{
 if(L.bottom == L.top)
  return ERROR;
 else
 {
  e=(--L.top)->lp;
  return OK;
 }
}
Status emptystack(Sqstack L)
{
 if(L.bottom == L.top)
  return OK;
 else
  return ERROR;
}
Status emptystack1(Sqstack1 L)
{
 if(L.bottom == L.top)
  return OK;
 else
  return ERROR;
}

Sqstack shuru(Sqstack &S)
{
 Sqstack R;
 initstack(R);
 char ch,ch1;
 printf("输入广义表二叉树形式:");
 ch=getchar();
 while(10 != ch)
 {
  if(ch >= 'a' && ch <= 'z')//|| ch >= 'A' && ch <='Z')
  {
   push(S,ch);
   ch1=getchar();
   if(')' == ch1)
   {
    push(S,10);
    push(S,10);
   }
   ch=ch1;
  }
  else
  {
            ch1=getchar();
   if(',' == ch && ',' == ch1)
    push(S,10);
   ch=ch1;
  }
 }
 
 while(!emptystack(S))
 {
  pop(S,ch);
  //printf("%-3c",ch);
  push(R,ch);
 }
 return R;
}

void Createtree(Bitree &T)           // 先序创建二叉树
{
 // printf("进入了!");
 char ch;
 pop(W,ch);
 // printf("ch=%c  ",ch);
 if(ch == 10)                           //  如果是回车键置为空
  T=NULL;
 else
 {
  T=(Bitree)malloc(sizeof(pBitree));
  if(!T)
  {
   printf("分配失败!");
   exit(0);
  }
  T->data=ch;
  Createtree(T->lchild);
  Createtree(T->rchild); 
 }
 // getchar();
}                               // 创建二叉树结束

void xianxu(Bitree T,Sqstack1 &S)   //  先序非递归遍历,采用的是保存右孩子的地址通过栈实现
{
 printf("先序非递归遍历输出:\n");
    if(T)
 {
  if(T->rchild)
   push1(S,T->rchild);    //  专门压入右孩子指针地址
  printf("%-3c",T->data);
  T=T->lchild;            //  更新指针
 }else
  exit(0);
 while(T || !emptystack1(S))     //  循环终止条件
 {
  if(T!= NULL)             //  始终作为一个点存在加以判断,一种情况是一直指向左孩子,另一种就是出栈弹出的右孩子
  {
   printf("%-3c",T->data);    //  输出节点的数据域
   if(T->rchild != NULL)    // 该节点存在右孩子,将右孩子入栈
    push1(S,T->rchild);
   T=T->lchild;       //  更新指针,始终往左走
  }
  else
   pop1(S,T);  
 }
}

void cengci(Bitree T,queue &Q)
{
    if(!T)
 {
  printf("树为空!");
  exit(0);
 }
 Binode *P,*S;
 S=P=Q.front;
 enqueue(Q,T);
 while(P != Q.rear)
 {
  if(P->lp->lchild)
   enqueue(Q,P->lp->lchild);
  if(P->lp->rchild)
   enqueue(Q,P->lp->rchild);
  P++;
 }
 printf("层次遍历为:\n");
 while(S < Q.rear)
 {
  printf("%-3c",S->lp->data);
  S++;
 }
}

 

最后就是定义主函数函数调用了,包含于头文件main_gercs.cpp中

#include"t11.h"
#include"gercs.h"
#include"gercs.cpp"

void main()
{
 // char ch;
 Bitree S;
    queue U;
 Sqstack1 Q;
    initstack(W);
 initstack1(Q);
 inittree(S);
 initqueue(U);
 W=shuru(W);
 /* while(!emptystack(W))
 {
 pop(W,ch);
 printf("%-3c",ch);
 
    }*/
 Createtree(S);
 xianxu(S,Q);
 printf("\n");
 cengci(S,U);
    printf("\n");
 
 
}

 

最后上传一张程序图片[置顶] 广义表的二叉树的形式_第1张图片

程序的注释由于自己刚编写的,没有及时加上,等自己有时间加上详细注释,现在做了这么多得实验,发现学了数据结构,不仅自己对语言的熟练程度变得更深了,而且编程思想和以前完全不一样了,程序的设计很快就可以完成。遇到的困难也会解决,相信只要自己不断深入学习对这方面的理解就会变得更深刻。自己也是一个意志坚强的男孩,只要有困难一定会有解决的办法。留住最真的于2012.04.25.18:46写。~~~~~~~~~~~~~~~~~~~~~~~~~~~

你可能感兴趣的:(数据结构,编程,c,struct,null,语言)