Не изменяется глобальная переменная при выходе из функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, никак не могу понять, почему глобальная переменная-счетчик меняется в функции Create(вижу в конструкторе), но во время рекурсии все изменения исчезают.Пробовала передавать с помощью указателей в функцию, но такой же эффект. Я приведу весь код программы:
#include <stdio.h>
#include  <conio.h>
#include <time.h>
#include  <stdlib.h>
#include <alloc.h>
#include <math.h>
 
#define ESC 27
#define TRUE 1
#define FALSE 0
 
typedef struct TREE *pTREE;
typedef struct TREE //Tree - звено дерева
{
   int x; //x - вершины дерева
   int bal; //показатель баланса (0,1,-1)
   pTREE L,R; //Адресные поля. Адрес левой части и Адрес правой части (от left,right)
} tree;

pTREE Create_T(tree *T,int *mas,long i,long *Count)//создание случайного дерева поиска
{ int growth;
  long count;
  tree *T1=0, *T2=0;
  count=*Count;
  if (!T) {
            T= (tree*)malloc(sizeof(tree));//выделение памяти под корень дерева
            T->x=mas[i];
            T->L=0;
            T->R=0;
            T->bal=0; // Вершине присвоили нулевой баланс.
            growth=TRUE;
          }
 else if (mas[i]<(T->x)) //Если вновь вводимый элемент mas[i] меньше чем элемент x из вершины дерева, создаем левую ветвь
       {
       T->L=Create_T(T->L,mas,i,&count); //рекурсивно помещаем элемент в новую ветку дерева
       if (growth==1)  // выросла левая ветвь
           switch (T->bal)
           {
             case 1:  T->bal=0; growth=FALSE; break;   // Предыдущая несбалансированность уравновесилась.
             case 0:  T->bal=-1; break;   // Вес "склонился" влево.
             case -1: //баланс нарушился и дерево необходимо перестраивать
                      T1 = T->L;
                      if (T1->bal==-1)     //Однократный LL-поворот.
                      {
                         ++count;
                         T->L=T1->R;
                         T1->R=T;
                         T->bal=0;
                         T=T1;
                      }
                      else       //Двукратный LR-поворот.
                      {
                        ++count;
                        T2 = T1->R;
                        T1->R = T2->L;
                        T2->L = T1;
                        T->L = T2->R;
                        T2->R = T;
                        //Пересчет баланса вершины с указателем T.
                        if (T2->bal==-1) T->bal = 1;
                        else T->bal = 0;
                       // Пересчет баланса вершины с указателем T1.
                        if (T2->bal==1)
                          T1->bal = -1;
                        else
                          T1->bal = 0;
                        T = T2;
                      }
                      T->bal = 0;
                      growth = FALSE;
                      break;
            }
      }
      // иначе выросла правая дуга.
else if ((mas[i]>(T->x)))//Если  вновь вводимый элемент mas[i] больше, чем элемент x из вершины дерева, создаем правую ветвь
   {
    T->R=Create_T(T->R,mas,i,&count); //рекурсивно помещаем элемент в новую ветку дерева
    if (growth==1)  // Если высота поддерева увеличилась, то выросла правая дуга.
        switch (T->bal)
        {
          case -1:  T->bal = 0; growth = FALSE; break;
          case  0:  T->bal = 1;break;
          case  1: //баланс нарушился и дерево необходимо перестраивать
                     T1 = T->R;
                     if (T1->bal==1)
                     { //Однократный RR-поворот.
                      ++count;
                      T->R = T1->L;
                      T1->L = T;
                      T->bal = 0;
                      T = T1;
                     }
                     else
                    { //Двухкратный RL-поворот.
                     ++count;
                     T2 = T1->L;
                     T1->L = T2->R;
                     T2->R = T1;
                     T->R = T2->L;
                     T2->L = T;
                     // Пересчет баланса вершины с указателем p.
                     if (T2->bal==1)
                         T->bal = -1;
                     else
                         T->bal = 0;
                      //Пересчет баланса вершины с указателем p1.
                     if (T2->bal==-1)
                         T1->bal = 1;
                     else T1->bal = 0;
                        T = T2;
                   }
                   T->bal = 0;
                   growth = FALSE;
                   break;
         }
   }
 return T;
}
 
int Sum_L (tree *T, int L) //средняя длинна пути до вершины. L: уровень вершины
{
  if (!T)
    return 0;
   else
      return (L+Sum_L(T->L,L+1)+Sum_L(T->R,L+1));
}
 
int size (tree *T) //вычисление размера дерева
{
 if (!T)
  return 0;
 else
   return (1+size(T->L)+size(T->R));
}

int main()
{
   long i=0, n=0,//количество вершин в дереве
        count=0;//количество поворотов при баллансировке
   int *mas;   //массив случайных чисел
   tree *T=NULL;   //инициализация указателя на АВЛ дерево
   char key;
   float H_av=0.0;
 
    do
  {
   n=0;
   count=0;
   H_av=0.0;
   T=NULL;
   randomize();
   clrscr ();
   fflush(stdin);
   printf("\n Construction of ABL tree.\n ");
   printf("\n Enter the number of vertex: n= ");
     scanf("%d",&n);
     if (n==0){
       printf("\n Error ! The number of vertex is NULL!");
       getch();
       exit(0);
       }
 
   mas=(int*)malloc(n*sizeof (int)); //выделение памяти под массив вершин
   if (mas==NULL){
    puts("Err 1! The array is not created!");
    getch();
    exit(0);
    }
   mas[0]=4;
   mas[1]=5;
   mas[2]=7;
   mas[3]=2;
   mas[4]=1;
   mas[5]=3;
   mas[6]=6;
   /*for (i=0; i<n; i++){    //заполнение массива случайными числами
      mas[i]=random(100);
      }     */
   for (i = 0; i < n; i++) {
        T=Create_T(T,mas,i,&count);  //создание случайного АВЛ дерева
        }
   if (T==NULL){
     printf ("\n Err 4. Fault create of ABL tree! \n");
     getch();
     exit(0);
     }
   H_av=Sum_L(T,1)/size(T);   //средняя высота дерева
   printf("\n The average height of the tree %1.0f \n ", H_av);
   printf("\n The count of rotatin is %d \n ", count);
   free(T);
   for (i = 0; i < n; i++) {
    free(mas);
    }
   puts ("\n\n Repeat the program with other number of vertices? (No=Esc)");
   key=getch();
  }
  while (key!=ESC);
    return 0;
}

Решение задачи: «Не изменяется глобальная переменная при выходе из функции»

textual
Листинг программы
++(*Count);
//...
T->L=Create_T(T->L,mas,i,Count);

Объяснение кода листинга программы

  1. Count - глобальная переменная, которая увеличивается на 1.
  2. T - структура данных, в которой хранится информация о списке.
  3. L - поле структуры T, которое содержит указатель на первый элемент списка.
  4. Create_T - функция, которая создает новый элемент списка и добавляет его в список.
  5. mas - массив, в котором хранятся данные элементов списка.
  6. i - индекс элемента списка, который добавляется.
  7. Count - глобальная переменная, которая передается в функцию Create_T и используется для отслеживания количества элементов в списке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы