문제

I'm implementing an AVL tree in C. I've posted my tree rotations below, as well as the valgrind errors I get when I try to test them.

Why am I getting these errors? I understand that the valgrind errors stem from the fact that I'm using null pointers, but I can't pinpoint exactly what I'm doing wrong. (I've commented on the lines of the Valgrind errors)

Tree rotateRight(Tree t)
{
    Tree temp = t->L;
    t->L=temp->R;
    temp->R=t;
    temp->height=maximum(heightT(temp->L), heightT(temp->R));
    t->height=maximum(heightT(t->L), heightT(t->R));
    return t;
}

Tree rotateLeft(Tree t)
{
    Tree temp = t->R; //This is line 226
    t->R=temp->L;
    temp->L=t;
    temp->height=maximum(heightT(temp->L), heightT(temp->R));
    t->height=maximum(heightT(t->L), heightT(t->R));
    return t;
} 

Tree rotateLeftRight(Tree t)
{
    t->L=rotateLeft(t->L); //Line 235
    t=rotateRight(t);
    return t;
}

Tree rotateRightLeft(Tree t)
{
    t->R=rotateRight(t->R);
    t=rotateLeft(t);
    return t;
}

Valgrind errors(I'm getting the same thing for rotateLeft):

==20073== Invalid read of size 8
==20073==    at 0x40196F: rotateLeft (bst.c:226)
==20073==    by 0x401A11: rotateLeftRight (bst.c:235)
==20073==    by 0x4013A9: insertT (bst.c:69)
==20073==    by 0x400E77: addin (Spell13.c:96)
==20073==    by 0x400CBE: main (Spell13.c:59)
==20073==  Address 0x10 is not stack'd, malloc'd or (recently) free'd
==20073== 
==20073== 
==20073== Process terminating with default action of signal 11 (SIGSEGV)
도움이 되었습니까?

해결책

Taking the code that you have + the error report, it appears as though Tree would look something like this:

typedef struct Tree_s
{
    struct Tree_s *L;
    struct Tree_s *R;
} Tree;

It would also appear that Tree->L that was passed to rotateLeftRight was NULL

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top