共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									void CreatBiTree(BiTree T) 
{ 
    char a; 
    
    scanf("%c",&a); 
    if(a=='@') 
     T=NULL; 
    else 
     { 
       T=(BiTree)malloc(sizeof(BiNode)); 
       T-data=a; 
       CreatBiTree(T-lchild); 
       CreatBiTree(T-rchild); 
     } 
     
} 
虽能编译,但不能正确运行,冥思苦想n小时,未果 
遂改其为 
BiTree CreatBiTree() 
{ 
    char a; 
    BiTree T; 
    scanf("%c",&a); 
    if(a=='@') 
     T=NULL; 
    else 
     { 
       T=(BiTree)malloc(sizeof(BiNode)); 
       T-data=a; 
       T-lchild=CreatBiTree(); 
       T-rchild=CreatBiTree(); 
     } 
     return T; 
} 
不再用传递参数,用返回值,正确编译运行,喜。 
重审前程序,改为 
void CreatBiTree(BiTree *T) 
{ 
    char a; 
    scanf("%c",&a); 
    if(a=='@') 
     *T=NULL; 
    else 
     { 
       *T=(BiTree)malloc(sizeof(BiNode)); 
       (*T)-data=a; 
       CreatBiTree(&((*T)-lchild)); 
       CreatBiTree(&((*T)-rchild)); 
     } 
    
} 
正确编译运行,惑。 
又冥思苦想n小时,终于悟出其中原由(好象多难似的,或者其实是我太愚钝) 
原来还是对指针的理解不够深刻 
最开始的程序传递的是Node型结构体的指针,于是在函数中会生成一个形参也指向这个结构体,但在函数中有一句T=(BiTree)malloc(sizeof(BiNode)); 改变了形参的指向,以后再对形参的任何操作不会在主函数中的T产生影响。 
下面是两个完整的程序,分别用的两种建树方法 
#include "stdlib.h" 
#include "conio.h" 
typedef struct node 
{ 
    char data; 
    struct node *lchild,*rchild; 
}BiNode,*BiTree; 
BiTree CreatBiTree() 
{ 
    char a; 
    BiTree T; 
    scanf("%c",&a); 
    if(a=='@') 
     T=NULL; 
    else 
     { 
       T=(BiTree)malloc(sizeof(BiNode)); 
       T-data=a; 
       T-lchild=CreatBiTree(); 
       T-rchild=CreatBiTree(); 
     } 
     return T; 
} 
void PreOrderTraverse(BiTree T) 
{ 
   if(T) 
    { 
     printf("%c",T-data); 
       PreOrderTraverse(T-lchild); 
       PreOrderTraverse(T-rchild); 
     } 
} 
void InOrderTraverse(BiTree T) 
{ 
     if(T) 
       { 
InOrderTraverse(T-lchild); 
printf("%c",T-data); 
InOrderTraverse(T-rchild); 
       } 
} 
void PostOrderTraverse(BiTree T) 
{ 
    if(T) 
    { 
        PostOrderTraverse(T-lchild); 
        PostOrderTraverse(T-rchild); 
        printf("%c",T-data); 
    } 
} 
main() 
{ 
BiTree T; 
clrscr(); 
T=CreatBiTree(); 
PreOrderTraverse(T); 
printf("n"); 
InOrderTraverse(T); 
printf("n"); 
PostOrderTraverse(T); 
} 
二 
#include "stdlib.h" 
#include "conio.h" 
typedef struct node 
{ 
    char data; 
    struct node *lchild,*rchild; 
}BiNode,*BiTree; 
void CreatBiTree(BiTree *T) 
{ 
    char a; 
    
    scanf("%c",&a); 
    if(a=='@') 
     *T=NULL; 
    else 
     { 
       *T=(BiTree)malloc(sizeof(BiNode)); 
       (*T)-data=a; 
       CreatBiTree(&((*T)-lchild)); 
       CreatBiTree(&((*T)-rchild)); 
     } 
     
} 
void PreOrderTraverse(BiTree T) 
{ 
   if(T) 
    { 
     printf("%c",T-data); 
       PreOrderTraverse(T-lchild); 
       PreOrderTraverse(T-rchild); 
     } 
} 
void InOrderTraverse(BiTree T) 
{ 
     if(T) 
       { 
InOrderTraverse(T-lchild); 
printf("%c",T-data); 
InOrderTraverse(T-rchild); 
       } 
} 
void PostOrderTraverse(BiTree T) 
{ 
    if(T) 
    { 
        PostOrderTraverse(T-lchild); 
        PostOrderTraverse(T-rchild); 
        printf("%c",T-data); 
    } 
} 
main() 
{ 
BiTree T; 
clrscr(); 
CreatBiTree(&T); 
PreOrderTraverse(T); 
printf("n"); 
InOrderTraverse(T); 
printf("n"); 
PostOrderTraverse(T); 
} 
更多数据结构实例http://hi.baidu.com/longzuo
							 
							 
							 
							  
							  
							  楼主 2016-04-28 11:12 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知