2012-02-28 85 views
0

这里是我对AvlTree实现的代码,但是有一个错误,当我运行时,它表示运行时失败:P未初始化,以及如何修复我的代码? 这里是AVL树的实现

#include "avltree.h"; 
#include "fatal.h"; 
//#include<iostream> 
#include<stdlib.h> 
//using namespace std; 
struct AvlNode 
{ 
    ElementType Element; 
    AvlTree left; 
    AvlTree right; 
    int Height; 
    }; 
AvlTree MakeEmpty(AvlTree T) 
{ 

    if (T!=NULL) 
    { 
     MakeEmpty(T->left); 
    MakeEmpty(T->right); 
    free(T); 
} 
    return NULL; 
} 
Position Find(ElementType X,AvlTree T) 
{ 
    if (T==NULL) 
     return NULL; 
    if (X<T->Element) 
     return Find(X,T->left); 
    else 
     if (X>T->Element) 
      return Find(X,T->right); 
     else 
      return T; 
    } 
Position FindMin(AvlTree T) 
{ 

     if (T==NULL) 
      return NULL; 
     else 
      if (T->left=NULL) 
       return T; 
      else 
       return FindMin(T->left); 


} 

Position FindMax(AvlTree T){ 
    if(T!=NULL) 
     while(T->right!=NULL) 
      T=T->right; 
    return T; 





} 

static int Height(Position P) 
{ 
    if (P==NULL) 
     return -1; 
    else 
     return P->Height; 


} 

static int Max(int Lhs,int Rhs){ 
    return Lhs>Rhs?Lhs:Rhs; 

} 



static Position rotateleft(Position K2) 

{ 

    Position K1; 
    K1=K2->left; 
    K2->left=K1->right; 
    K1->right=K2; 
    K2->Height=Max(Height(K2->left),Height(K2->right))+1; 
    K1->Height=Max(Height(K1->left),K2->Height)+1; 
    return K1; 
    } 
static Position rotateright(Position K1) 
{ 

    Position K2; 
    K2=K1->right; 
    K1->right=K2->left; 
    K2->left=K1; 
    K1->Height=Max(Height(K1->left),Height(K1->right))+1; 
    K2->Height=Max(Height(K2->right),K1->Height)+1; 
    return K2; 




} 
static Position DoubleLeft(Position K3) 
{ 
    K3->left=rotateright(K3->left); 
    return rotateleft(K3); 



} 

static Position DoubleRight(Position K1){ 

    K1->right=rotateleft(K1->right); 
    return rotateright(K1); 


} 
AvlTree Insert(ElementType X,AvlTree T) 
{ 

    if (T==NULL) 
    { 

     T=(AvlNode*)malloc(sizeof(struct AvlNode)); 
     if (T==NULL) 
      FatalError("Out of space"); 
     else 
     { 

      T->Element=X;T->Height=0; 
      T->left=T->right=NULL; 



     } 



    } 
    else 
     if (X<T->Element) 
     { 

      T->left=Insert(X,T->left); 
      if (Height(T->left)-Height(T->right)==2) 
       if (X<T->left->Element) 
        T=rotateleft(T); 
       else 
        T=DoubleLeft(T); 
        } 

     else 
      if (X>T->Element) 
      { 
       T->right=Insert(X,T->right); 
    if(Height(T->right)-Height(T->left)==2) 
     if(X>T->right->Element) 
      T=rotateright(T); 
     else 
      T=DoubleRight(T); 
} 


      T->Height = Max(Height(T->left), Height(T->right)) + 1; 
return T; 


} 
AvlTree Delete(ElementType X, AvlTree T) 

{ 
    printf("Sorry; Delete is unimplemented; %d remains\n", X); 

    return T; 


} 
ElementType Retrieve(Position P) 

{ 
    return P->Element; 

} 

int main(){ 

    AvlTree T; 
    Position P; 
    int i; 
    int j=0; 
    T=MakeEmpty(NULL); 
    for (i=0;i<50;i++,j=(j+7)%50) 
     T=Insert(j,T); 
    for (i=0;i<50;i++) 
     if (P==Find(i,T)==NULL || Retrieve(P)!=i) 
      printf("Error at %d\n", i); 

    printf("Min is %d, Max is %d\n", Retrieve(FindMin(T)), 
Retrieve(FindMax(T))); 
    return 0; 
} 
+2

来看,这一个调试器中,找到产生错误......具体点(或把一些打印语句),有太多的代码,并没有足够的时间阅读它... – Nim 2012-02-28 15:35:26

+0

家伙我有改变代码,它编译没有警告或错误,但在我运行后,它显示我窗口wwith宣布我的程序已停止工作 – 2012-02-28 15:59:37

+0

似乎你的问题已被回答。 – Richard 2012-12-09 13:11:26

回答

2

我认为错误是你使用双=这里:

if (P==Find(i,T)==NULL || Retrieve(P)!=i) 
    printf("Error at %d\n", i); 

的想法是有P将找到的价值,对不对?

+0

是的它是正确的 – 2012-02-28 15:42:44

2

你没有包含文件“avltree.h”,所以任何人都不可能编译这段代码。

然而,有一个错误脱颖而出:

if (P==Find(i,T)==NULL || Retrieve(P)!=i) 
    ^^ this is not an assignment 

我想你想:

if ((P=Find(i,T))==NULL || Retrieve(P)!=i) 
+0

我有改变代码,它编译好,但没有告诉我什么为什么? – 2012-02-28 15:52:19

+0

@dato,这将是一个单独的问题。 – Richard 2012-12-09 13:10:26

2

,我认为这就是问题所在:

if (P==Find(i,T)==NULL || Retrieve(P)!=i) 

P是未被分配且尚未初始化,因此P将不会是NULL意味着第一个条件将返回falseRetrieve()将被调用并且没有初始化的P

应该是:

if ((P = Find(i,T)) == NULL || Retrieve(P)!=i) 
1
int main(){ 

    AvlTree T(); 
    Position P();