Форум программистов, компьютерный форум CyberForum.ru

Объяснение части кода - C++

Восстановить пароль Регистрация
 
Гузель23
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 56
04.04.2014, 07:52     Объяснение части кода #1
ребят, помогите пожалуйста)
не могу разобраться в коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
typedef struct derevo
{
    int data;
    derevo *left;
    derevo *right;
} node;
node * search (node * tree, int data)   //поиск места для элементов дерева
{
    node *buf;    //я так понимаю, что buf -это временное хранение дерева
 
    if (tree) //если дерево существует
     do
        {
       buf=tree;  //buf хранит указатель на начало дерева
          if (tree->data==data) //берем элемент дерева
                return tree;   
           if (data<tree->data) //если он меньше чем текущий,
                tree=tree->left;//записываем его в левую ветку
            else
                tree=tree->right;//иначе в правую
        }
while (tree);    //пока дерево сущ, все это выполняется
 return buf;
}
int Add (node **tree, int data)//добавление элементов в дерево    (адрес корня может измениться)
{
    node * buf; //служит для заполнения дерева, tree содержит указатели на buf
   if (!  ( buf = (node *) malloc ( sizeof (node) ) )  )       //выделяетя память под buf
    {
 
        return -1;
    }
    buf = new node; //выделяем память под звено дерева
    buf->data=data;//записываем данные в звено
    buf->left=NULL;//подзвенья обнуляем
    buf->right=NULL;
if (!*tree)  //если дер пустое
    {
*tree=buf; //добав в дер нов узел
return 1;
    }
if (search(*tree,data))
    {
if (data<search(*tree,data)->data)  //добавляем к правому и левому поддереву
     search(*tree,data)->left=buf;
        else
     search (*tree,data)->right=buf;
    }
else
  return -1;
 return 0;
}
все ли я правильно поняла? если не сложно можете расписать что такое buf, для чего он служит.
и еще :
C++
1
2
while (tree);    //пока дерево сущ, все это выполняется
 return buf;
что именно возвращает buf ? например есть дерево 7,5,9, к нему добавляется элемент 15, проходит всю функцию, и что в конце возвращает buf?
заранее спасибо)
Изображения
 
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гузель23
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 56
07.04.2014, 15:07  [ТС]     Объяснение части кода #2
ребяят, ну помогите((
somebdy
7 / 7 / 1
Регистрация: 30.04.2013
Сообщений: 25
07.04.2014, 17:05     Объяснение части кода #3
Прошу! Слегка приправил своими комментариями и небольшими правками
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
typedef struct derevo {
    int data;
    derevo *left;
    derevo *right;
} node;
 
node * search(node * tree, int data) /* Поиск места для нового элемента */
{
    node * buf = NULL; /* Станет указателем на узел в дереве,
                          к левой или правой ветви которого
                          можно присоединить новый узел (элемент).
                          Либо NULL, если дерева не существует */
 
    if (tree) /* если дерево существует */
        do {
            buf = tree; /* buf хранит указатель на узел в дереве */
 
            if (tree->data == data) /* если значение в текущем узле равно data, */
                return tree;        /* возвращаем адрес этого элемента */
 
            if (tree->data > data) /* если значение в текущем узле больше data, */
                tree = tree->left; /* то двигаемся по левой ветви */
            else
                tree = tree->right; /* иначе по правой */
        } while (tree); /* пока не дойдем до конца дерева */
 
    return buf; /* Вернули адрес найденного узла, либо NULL */
}
 
int Add(node ** tree, int data) /* добавление элемента в дерево (адрес корня может измениться) */
{
    node * buf; /* служит для хранения адреса нового узла, для последующего
                   добавления в дерево */
    
    /* выделяем память под узел
       завешаем выполнение функции
       если произошла ошибка при выделении */
    if (!(buf = (node *)malloc(sizeof(node)))) 
    {
        return -1;
    }
 
    buf->data = data; /* записываем данные в звено */
    buf->left = NULL; /* подзвенья обнуляем */
    buf->right = NULL;
 
    /* если дерево пустое */
    if (!*tree) {
        *tree = buf; /* добавим в дерево новый узел */
        return 1;
    }
 
    /* ищем подходящее место для нового узла */
    node * founded_node = search(*tree, data);
 
    if (founded_node) /* если founded_node не NULL, */
    {                 /* т.е нашли подходящее место для нового узла */
        if (founded_node->data > data) /* присоединяем узел к правому либо левому поддереву */
            founded_node->left = buf;
        else
            founded_node->right = buf;
    } else {
        free(buf); /* освободим память выделенную под узел, если его некуда присоединить,
                      если не освободить, то произойдет утечка памяти  */
        return -1;
    }
    return 0;
}
В 42 строке было выделение памяти через new. Это излишне т.к мы уже выделили память в 38 строке.
Касаемо 59 и 61 строк. Функция search может вернуть указатель на узел который находится в середине дерева, а в этих строчках мы просто так берем и переприсваиваем указатели на уже существующие узлы и как следствие, ветви. В результате все становится плохо. С этим нужно что-то делать.
Гузель23
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 56
07.04.2014, 18:30  [ТС]     Объяснение части кода #4
спасибо большое
Yandex
Объявления
07.04.2014, 18:30     Объяснение части кода
Ответ Создать тему
Опции темы

Текущее время: 11:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru