2017-10-20 28 views
0

Je reçois une erreur dans la création de mon arbre AVL, la sortie de mon code donne une boucle infinie à chaque fois.Obtenir l'erreur dans l'arbre AVL

Dans le code suivant mknode fonction est utilisée pour créer un node et lr,rl,right,leftfunctions sont utilisés pour effectuer les rotations nécessaires alors que la fonction d'insertion permet d'insérer les valeurs dans l'arbre AVL, puis effectuer les rotations selon l'exigence.

J'ai vérifié mon code plusieurs fois mais je n'ai pas pu trouver l'erreur.

S'il vous plaît aidez-moi.

struct node 
{int a; 
struct node *left,*right; 
int height; 
}*root; 
int bal_factor(struct node*); 
int height(struct node*); 
int greater(int,int); 
struct node*mknode(int); 
struct node*insert(struct node*,int); 
struct node*left(struct node*); 
struct node*right(struct node*); 
struct node*lr(struct node*); 
struct node*rl(struct node*); 
void inorder(struct node*); 
void main() 
{ 
printf("avl tree\n"); 
root=insert(root,30); 
root=insert(root,40); 
root=insert(root,20); 
root=insert(root,10); 
root=insert(root,45); 
inorder(root); 
} 
void inorder(struct node *temp) 
{ 
if(temp==NULL) 
    return; 
inorder(temp->left); 
printf("%d\t",temp->a); 
inorder(temp->right); 
} 
int bal_factor(struct node *temp) 
{ 
if(temp==NULL) 
    return 0; 
else 
return(height(temp->left)-height(temp->right)); 
} 
int height(struct node *temp) 
{ 
if(temp==NULL) 
    return 0; 
else 
    return greater(height(temp->left),height(temp->right))+1; 

} 
int greater(int a,int b) 
{ 
if(a>b) 
    return a; 
else 
    return b; 
} 
struct node* mknode(int t) 
{ 
struct node *temp; 
temp=(struct node*)malloc(sizeof(struct node)); 
temp->a=t; 
temp->left=temp->right=NULL; 
temp->height=1; 
return temp; 
}; 
struct node*right(struct node *temp) 
{struct node* temp1; 
temp1=temp->left; 
temp->left=temp1->right; 
temp1->right=temp; 
temp1->height=greater(height(temp1->left),height(temp1->right))+1; 
temp->height=greater(height(temp->left),height(temp->right))+1; 
return temp1; 
}; 
struct node* left(struct node *temp) 
{ struct node* temp1; 
temp1=temp->right; 
temp->right=temp1->left; 
temp1->left=temp; 
temp1->height=greater(height(temp1->left),height(temp1->right))+1; 
temp->height=greater(height(temp->left),height(temp->right))+1; 
return temp1; 
}; 
struct node* lr(struct node *temp) 
{ 
temp->left=left(temp->left); 
return right(temp); 
}; 
struct node* rl(struct node *temp) 
{ 
temp->right=right(temp->right); 
return left(temp); 
}; 
struct node* insert(struct node *temp,int t1) 
{ 
if(temp==NULL) 
    return mknode(t1); 
if(t1<temp->a) 
    temp->left=insert(temp->left,t1); 
else 
    temp->right=insert(temp->right,t1); 
int t; 
temp->height=greater(height(temp->left),height(temp->right))+1; 
t=bal_factor(temp); 
if(t>1&&t1<temp->left->a); 
return right(temp); 
if(t1<-1&&t1>temp->right->a); 
return left(temp); 
if(t<-1&&t1<temp->right->a); 
return rl(temp); 
if(t>1&&t1>temp->left->a); 
return lr(temp); 

return temp; 
} 
+0

S'il vous plaît apprendre comment indenter votre code. –

Répondre

1

Ceci est faux:

if (t>1 && t1<temp->left->a); 
    return right(temp); 
    if (t1<-1 && t1>temp->right->a); 
    return left(temp); 
    if (t<-1 && t1<temp->right->a); 
    return rl(temp); 
    if (t>1 && t1>temp->left->a); 
    return lr(temp); 

Vous avez probablement voulu ceci:

if (t>1 && t1<temp->left->a) 
    return right(temp); 
    if (t1<-1 && t1>temp->right->a) 
    return left(temp); 
    if (t<-1 && t1<temp->right->a) 
    return rl(temp); 
    if (t>1 && t1>temp->left->a) 
    return lr(temp); 

Notez l'absence de ; après les lignes commençant par if.

Aucun lien:

temp = (struct node*)malloc(sizeof(struct node)); 

doit être écrit

temp = malloc(sizeof(struct node)); 

Vous ne la chassez la valeur de retour de malloc en C.

+0

si nous utilisons temp = malloc (sizeof (struct node)); que cela renvoie le pointeur vide qui doit être typecasted dans le pointeur de type de noeud struct. – Harsh

+0

@Harsh pour une explication [lisez ceci] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

+0

en passant merci de m'avoir aidé maintenant mon code génère la bonne sortie – Harsh