в вашей первой версии treeNode *q = p->right;
не в блоке ({}
)
другой возможностью было добавить этот блок
case RH:
{
treeNode *q = p->right;
switch(q->bf)
{
case LH:
(*T)->bf=RH;
p->bf=EQ;
break;
case EQ:
(*T)->bf=q->bf=EQ;
break;
case RH:
p->bf=LH;
(*T)=EQ;
break;
}
q->bf=EQ;
R_Rotate(&p);
L_Rotate(T);
break;
}
Предупреждение
(*T)=EQ;
очень подозрительно, потому что *T
- это treeNode *
, а EQ - не один из-за case EQ
Возможно, вы хотите
(*T)->bf = EQ;
(edit)
Поскольку @dbush указывает, что достаточно добавить оператор между меткой и объявлением, но не помещать объявление в блок очень опасно, посмотрите на этот код:
#include <stdio.h>
int main(int argc, char ** argv)
{
switch (argc) {
case 1:
puts("case 1");
int i = 123;
puts("i initialized and continue in case 2");
case 2:
printf("in case2, i values : %d\n", i);
}
return 0;
}
Как насчет i , используемого в printf , если программа вызывается с аргументом, инициализирующим argc , равным 2?
Примечание gcc принимает этот код, но не g ++ без опции -fpermissive
, и с этой опцией код компилируется без case 2:
Вот почему япредложил добавить блок.