回 帖 发 新 帖 刷新版面

主题:[讨论]大虾们帮我看看着个程序有什么错误

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#define N 100

typedef struct node{
      int data;
      struct node *left;
      struct node *right;
}  NODE;

NODE *root,*root1;
int intree[N],pretree[N],posttree[N];
int pre,in,post;

void createtree()
{
    NODE *node,*p;
    int data;
    printf("\nEnter some numbers(end of 0):");
    root=(NODE *)malloc(sizeof(NODE));
    scanf("%d",&data);
    root->data = data;
    root->left = NULL;
    root->right = NULL;
    if(data)
    {      scanf("%d",&data);
           while(data)
           {
            node=(NODE *)malloc(sizeof(NODE));
            node->data = data;
            node->left = NULL;
            node->right = NULL;

            p=root;
            while((p->left && data < p->data) || (p->right && data >= p->data) )
                if(p->left && data < p->data )  p=p->left ;
                else if(p->right && data >= p->data ) p=p->right ;
            if(data < p->data) p->left = node;
            else if(data >= p->data ) p->right = node;
            scanf("%d",&data);
           }
        }
}

void preprinttree(NODE *tree)
{
    if(tree)
    {
    printf("%3d",tree->data );
    preprinttree(tree->left);
    preprinttree(tree->right);
    }
}

void inprinttree(NODE *tree)
{
    if(tree)
    {
    inprinttree(tree->left);
    printf("%3d",tree->data );
    inprinttree(tree->right);
    }
}

void postprinttree(NODE *tree)
{
    if(tree)
    {
    postprinttree(tree->left);
    postprinttree(tree->right);
    printf("%3d",tree->data );
    }
}

int  treedeep(NODE *tree)
{  /*计算树的深度*/
 int left=0,right=0;
 if(!tree) return 0;
 else
 {
 left=treedeep(tree->left); /*左子树的深度*/
 right=treedeep(tree->right); /*右子树的深度*/
 if(left>right) return (left+1); /*返回整个树的深度*/
 else           return (right+1);
 }
}
void printtree(NODE *tree,int x,int y)
{ int deep,k=1,sign=0;
  deep=treedeep(tree);
  if(tree)
   {
     gotoxy(x,y);
     printf("%d",tree->data);
     while(deep>2){ k=k*2;deep--;}
     deep=k;
     if(k/4) sign=1;
     if(tree->left)
    {
     gotoxy(x-k,y+1+sign);
     printf("/");
     if(sign){
           gotoxy(x-k+1,y+sign);
           while((deep--)>2) printf("-");
           }
     printtree(tree->left,x-k,y+2+sign);
    }
     if(tree->right)
    {
    if(sign){
         gotoxy(x+2,y+1);
         deep=k;
         while((deep--)>2) printf("-");
         }
     gotoxy(x+k,y+1+sign);
     printf("\\");
     printtree(tree->right,x+k,y+2+sign);
    }
     }

}
void print(NODE *tree,int x, int y)
{
  clrscr();
  printtree(tree,x,y);
  gotoxy(20,25);
  printf("Press any key to continue...");
  getche();
  return;
}

NODE *prein_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
   {
    tree=(NODE *)malloc(sizeof(NODE));
    tree->data=pretree[i];
    while(intree[i1+num]!=pretree[i] && num<j-i+1) num++;
    if(num<j-i+1)
     {
       tree->left=prein_tree(tree->left,i+1,i+num,i1,i1+num-1);
       tree->right=prein_tree(tree->right,i+num+1,j,i1+num+1,j1);
       return tree;
     }
    }
 return NULL;
}

 NODE *postin_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
   {
    tree=(NODE *)malloc(sizeof(NODE));
    tree->data=posttree[j];
    while(intree[i1+num]!=posttree[j] && num<j-i+1) num++;
    if(num<j-i+1)
     {
       tree->left=postin_tree(tree->left,i,i+num-1,i1,i1+num-1);
       tree->right=postin_tree(tree->right,i+num,j-1,i1+num+1,j1);
       return tree;
     }
    }
 return NULL;
}

freetree(NODE *tree)
{ NODE *left,*right;
  if(tree)
   { left=tree->left;
     right=tree->right;
     free(tree);
     freetree(left);
     freetree(right);
    }
}
void pre_in_post_tree()
{

  int choice,temp;
    clrscr();
    printf("\n\t1.input pre_root  tree");
    printf("\n\t2.input post_root tree");
    do{
        printf("\n\tYour choice:");
        scanf("%d",&choice);
        }while(choice<1 ||choice>2);
    pre=in=post=0;
    printf("\n\tinput in_tree list(end of 0):");
    scanf("%d",&temp);
    while(temp)
      { intree[in]=temp;
        in++;
        scanf("%d",&temp);
       }
    switch(choice)
    {
       case 1:  freetree(root1);
            printf("\n\tinput pre_tree list(end of 0):");
            scanf("%d",&temp);
            while(temp)
               { pretree[pre]=temp;
             pre++;
             scanf("%d",&temp);
            }
            root1=prein_tree(root,0,pre-1,0,in-1);
            printtree(root1,40,12);
            break;

       case 2:  freetree(root1);
            printf("\n\tinput post_tree list(end of 0):");
            scanf("%d",&temp);
            while(temp)
               { posttree[post]=temp;
             post++;
             scanf("%d",&temp);
            }
            root1=postin_tree(root1,0,post-1,0,in-1);
            printtree(root1,40,12);
            break;
       default: break;
    }

}
void del_node(NODE *tree)
{ /*在以tree为根的可查找二叉树中删除一个指定的节点*/
int data,left=-1;
NODE *p=tree,*p_parent=p,*p1,*p1_parent;
printf("\n\tEnter a number to delete:");
scanf("%d",&data);
while(p->data!=data && p)
   {
    p_parent=p;
     if(p->data > data)
    {  p=p->left;
       left=1;
    }
     else
    {
       p=p->right;
       left=0;
    }
     }/*在整个二叉树中查找要删除的节点*/
if(p) /*while退出时,如果p非空,说明在二叉树中data找到,即p是要删除的节点*/
   { 
     if(p->left && p->right)/*如果左右子树均非空,则在左子树中找一个最大的值去替代*/
    { p1=p->left;       /*p1记录左子树的根,p1_parent为p1节点的父节点*/
      p1_parent=p;
      while(p1->right)  /*while退出时,p1中的值即为最大的值,用来替代要删除节点p中的内容*/
          { p1_parent=p1; /*然后把p1节点释放掉,显然while退出时p1的右子树为空*/
        p1=p1->right;
        }           
      p->data=p1->data;/*将左子树中最大的值移到p节点内,相当于将原来的p节点内容清空,即删除*/
      if(p1_parent==p) p1_parent->left=p1->left;
              /*p1节点的内容已经移动到p内,所以要释放p1节点,如果p1节点刚好是p的左子树根节点*/
              /*在释放之前要将p1的左子树记录到p的left变量中*/
      else p1_parent->right=p1->left;/*否则,记录到p1的父节点right变量中*/
      free(p1);
     }
     else if(p_parent==p)/*前面的if条件不成立,则要删除的p节点至多只有一个子树,根据初始化的值*/
     {               /*此条件即判断出是删除根节点*/
      p1=NULL;
      if(p->left)  p1=p->left;  /*如果根节点的左子树非空,则用p1记录,同时其右子树肯定是空*/
      if(p->right) p1=p->right; /*的,将根节点p直接释放空间,然后让p记录p1的值。如果p的left*/
      free(p);                  /*和right均为空,则该树只有根节点,释放后为空树,所以p1初始*/                                    /*化为NULL*/
      p=p1;
     }
     else if(!p->left)
    {
     if(left==1) p_parent->left=p->right;
     if(left==0) p_parent->right=p->right;
     free(p);
     }
     else if(!p->right)
    {
     if(left==1) p_parent->left=p->left;
     if(left==0) p_parent->right=p->left;
     free(p);
     }

   }
  else
   {
    printf("\nSorry,can't find the number %d in the tree!",data);
    getche();
    }
}

int CompareTree(NODE *tree1,NODE *tree2)
{ int left,right;
 if(tree1 && tree2)
  {
   if(tree1->data!=tree2->data) return 0;
   else
    {
    left=CompareTree(tree1->left,tree2->left);
    right=CompareTree(tree1->right,tree2->right);
    if(left&&right) return 1;
    else   return 0;
    }
  }
 else if(!tree1 && !tree2)  return 1;
 else return 0;
}

void main(void)
{
  int choice,whichtree=0;
  clrscr();
    printf("\n\t\t-------------------------------\n");
    printf("\t\t|          The   Menu         |\n");
    printf("\t\t|      1.Create  a tree       |\n");
    printf("\t\t|      2.pre/in/post tree     |\n");
    printf("\t\t|      3.Print the tree       |\n");
    printf("\t\t|      4.del a node           |\n");
    printf("\t\t|      5.compare 2 trees      |\n");
    printf("\t\t|      6.exit                 |\n");
    printf("\t\t|      Choose:                |\n");
    printf("\t\t-------------------------------\n");
    do
      { gotoxy(31,10);
        scanf("%d",&choice);
        }while(choice<1 || choice>6);
     do{
    switch(choice)
     {
       case 1: freetree(root);
           createtree();
           whichtree=0;
           printf("\nPre-print-tree:");
           preprinttree(root);
           printf("\nIn-print-tree:");
           inprinttree(root);
           printf("\nPost-print-tree:");
           postprinttree(root);
           getche();
           break;
       case 2:  pre_in_post_tree();
            whichtree=1;
            getche();
            break;
       case 3:  if(whichtree==1)      print(root1,40,1);
            else                  print(root,40,1);
            break;
       case 4:  del_node(root);
            break;
       case 5:  if(CompareTree(root,root1)) printf("\nThe 2 tree is the same");
            else  printf("\nThe 2 tree is different!");
            getche();
            break;
       case 6:  printf("\n\n\n\t\tThanks,Good Bye!");
            exit(0);
            break;
       default: break;
      }
    clrscr();
    gotoxy(1,1);
    printf("\n\t\t-------------------------------\n");
    printf("\t\t|          The   Menu         |\n");
    printf("\t\t|      1.Create  a tree       |\n");
    printf("\t\t|      2.pre/in/post tree     |\n");
    printf("\t\t|      3.Print the tree       |\n");
    printf("\t\t|      4.del a node           |\n");
        printf("\t\t|      5.compare 2 trees      |\n");
    printf("\t\t|      6.exit                 |\n");
    printf("\t\t|      Choose:                |\n");
    printf("\t\t-------------------------------\n");
    do
      { gotoxy(31,10);
        scanf("%d",&choice);
        }while(choice<1 || choice>6);
    }while(choice!=6);
}

[size=1]#include<stdio.h>[/size][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1]

回复列表 (共1个回复)

沙发

奉劝阁下还是早点转用VC或BCB,早点告别TC这种面向DOS的极难调试的开发工具吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册