下列程序运行时会崩溃,请找出错误并改正,并且说明原因

下列程序运行时会崩溃,请找出错误并改正,并且说明原因。

#include <stdio.h> 
#include 
<malloc.h> 

typedef 
struct

    TNode
* left; 
    TNode
* right; 
    
int value; 
} TNode; 

TNode
* root=NULL; 
void append(int N); 

int main() 

    append(
63); 
    append(
45); 
    append(
32);
    append(
77); 
    append(
96); 
    append(
21); 
    append(
17); // Again, 数字任意给出 


void append(int N) 

    TNode
* NewNode=(TNode *)malloc(sizeof(TNode)); 
    NewNode
->value=N; 

    
if(root==NULL) 
    { 
        root
=NewNode;
        
return;
    } 
    
else 
    { 
        TNode
* temp; 
        temp
=root; 
        
while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL)) 
        { 
            
while(N>=temp.value && temp.left!=NULL)
                temp
=temp.left;
            
while(N<temp.value && temp.right!=NULL)
                temp
=temp.right;
        }
        
if(N>=temp.value)
            temp.left
=NewNode; 
        
else
            temp.right
=NewNode;
        
return
    }
}

 

 

解答:

 

[cpp]  view plain copy
  1. //下列程序运行时会崩溃,请找出错误并改正,并且说明原因。  
  2. /* 
  3. 此程序的功能是完成一个有序二叉树的建立,使得左子树结点的值小于根结点, 
  4. 右子树大于根结点. 题目程序中结构体定义的地方有误,在TNode名字出现之前, 
  5. 就在结构体内使用TNode,将导致编译错误.另外题目中append函数中的所有temp的点号操作符都应改成->, 
  6. 因为temp是个指针.至于题目中所说的程序在运行时崩溃出现在append函数中的对temp->left和temp->right操作时候,  
  7. 因为每创建一个新结点的时候都没将left和right成员初始化为空指针,会导致append函数中的while循环访问到非法内存, 
  8. 从而导致程序崩溃. 为了方便测试,添加了函数print_tree打印树的结点内容, 
  9. 另外补充了一个函数free_tree来释放动态分配的内存.修改后的程序如下: 
  10. */  
  11. #include <iostream>  
  12. using namespace std;  
  13. //typedef struct{   //错误1 TNode名字出现前,就在结构内使用TNode将导致编译错误  
  14. typedef struct TNode{ //应该这样写  
  15.     TNode* left;  
  16.     TNode* right;   
  17.    int value;   
  18. }TNode;  
  19.   
  20. TNode* root=NULL;   
  21. void append(int N);   
  22. void free_tree(TNode *root);  
  23. void print_tree(TNode *root);  
  24.   
  25.   
  26. int main()   
  27. {   
  28.     append(63);   
  29.     append(45);   
  30.     append(32);   
  31.     append(77);   
  32.     append(96);   
  33.     append(21);   
  34.     append(17); // Again, 数字任意给出   
  35.     print_tree(root);  
  36.     cout<<"\n memory released !\n";  
  37.     free_tree(root);  
  38.     system("pause");  
  39. return 0;  
  40. }   
  41.   
  42. void append(int N)   
  43. {  
  44.     TNode* NewNode=(TNode *)malloc(sizeof(TNode));   
  45.     if (!NewNode)  
  46.     {  
  47.         cout<<"memory alloc failure!\n";  
  48.         exit(1);  
  49.     }  
  50.   
  51.     NewNode->value=N;   
  52.     //NewNode->left;  
  53.     //NewNode->right; //错误2 没有初始化新结点的left和right成员为空指针,  
  54.                       //导致append函数中while循环访问到非法内存,从而导致运行时崩溃  
  55.     NewNode->left=NULL;  
  56.     NewNode->right=NULL;  
  57.     if(root==NULL)   
  58.     {   
  59.         root=NewNode;   
  60.         return;  
  61.     }   
  62.     else   
  63.     {   
  64.         TNode* temp;   
  65.         temp=root;   
  66.         //while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL))   
  67.         //错误3 temp是指针,则下面引用成员应该使用->而不是.(点)  
  68.         while((N>=temp->value && temp->left!=NULL) || (N<temp->value&&temp->right!=NULL))   
  69.         {  
  70.                while(N>=temp->value && temp->left!=NULL)   
  71.                    temp=temp->left;   
  72.                while(N<temp->value && temp->right!=NULL)  
  73.                    temp=temp->right;   
  74.         }   
  75.   
  76.         if(N>=temp->value)   
  77.             temp->left=NewNode;   
  78.         else   
  79.             temp->right=NewNode;   
  80.         return;   
  81.     }  
  82. }   
  83.   
  84.   
  85. //释放内存函数  
  86. void free_tree(TNode *root){  
  87.     if (!root->left && !root->right)  
  88.     {  
  89.         free(root);  
  90.         return;  
  91.     }  
  92.     if (root->left)  
  93.     {  
  94.         free_tree(root->left);  
  95.     }  
  96.     else{  
  97.         free_tree(root->right);  
  98.     }  
  99. }  
  100.   
  101.   
  102. //打印函数  
  103. void print_tree(TNode *root){  
  104.     if (!root->left && !root->right)  
  105.     {  
  106.         cout<<root->value<<" ";  
  107.         return;  
  108.     }  
  109.     if (root->right)  
  110.         print_tree(root->right);  
  111.   
  112.         cout<<root->value<<" ";  
  113.   
  114.     if (root->left)  
  115.     {  
  116.         print_tree(root->left);  
  117.     }  
  118. }  


版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值