2012-02-28 17 views
0

AvlTreeの実装のためのコードはここにありますが、実行時にエラーが1つあります。実行時にエラーが発生します:Pは初期化されず、コードを修正する方法は? ここでは、私はエラーはあなたがここに= doubleを使用していることであると信じ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

実行して、エラーを生成し、特定のポイントを見つけて...(あるいは、いくつかのprint文を入れて)、あまりにも多くのコードと十分ではない時間がありますそれを読むには... – Nim

+0

私は変更コードを持っていますが、警告やエラーなしでコンパイルしますが、実行後、私のプログラムが動作を停止したことをwwithが通知するウィンドウが表示されます –

+0

あなたの質問は答えられたようです。 – Richard

答えて

2

です:

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

アイデアは右、P店の検索の価値を持っているのですか?

+0

はいそれは正しいです –

2

"avltree.h"ファイルは含まれていないため、誰でもこのコードをコンパイルすることはできません。

しかし、1つの際立っているエラーがある:

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

私はあなたが望んでいたと思う:

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

私は変更コードがあり、それはうまくコンパイルされますが、何も表示されませんなぜですか? –

+0

@dato、これは別の質問です。 – Richard

2

私は、これが問題だと思う:Pとして

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

です割り当てられていないので初期化されていないのでPはになりません最初の条件がfalseRetrieve()を返すことを意味する210は、非組み込みのPで呼び出されます。

は次のようになります。デバッガ内部

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

    AvlTree T(); 
    Position P();