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

Необходимы пояснения по коду - C++

Восстановить пароль Регистрация
 
kdv12
1 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 33
12.01.2012, 00:49     Необходимы пояснения по коду #1
Здравствуйте знатоки C++. Прошу не бранить меня сильно за мои вопросы. Только начал изучать C++. Изучаю очереди. Нашел тут хороший топик - Списки, стеки, очереди . Из него почерпнул некоторые знания. Но есть не большой кусок кода, который я не могу понять. Если кто может, поясните мне данный код. А именно последние 2 строки кода. Что это за переменная tail? head как я понял это указатель на вершину очереди (первый добавленный элемент).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void enqueue(Type val)
{
    Node *Temp = new Node;
    Temp->elem = val;
 
    if (head == 0) // Если очередь пуста
    {
        head = tail = Temp;
        return;
    }
 
    tail->next = Temp;
    tail = Temp;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2012, 00:49     Необходимы пояснения по коду
Посмотрите здесь:

Для чего необходимы списки. C++
Пояснения условия C++
C++ Системы счисления(пояснения)
C++ Пояснения кода
Пишем рогалик: пояснения по коду и его критика C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
12.01.2012, 00:59     Необходимы пояснения по коду #2
Цитата Сообщение от kdv12 Посмотреть сообщение
Что это за переменная tail?
Это указатель на хвост очереди (т.е. на последний элемент). Должно быть так.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.01.2012, 01:22     Необходимы пояснения по коду #3
Ну я насколько понял, есть очередь элементов типа Node
C++
1
2
3
4
struct Node {
 Type elem
 Node* next
}
Эта функция добавляет элемент val в хвост этой очереди (на самом деле в ховст добавляется не val, а Node, с полем elem, равным val)

tail Это указатель на хвост очереди, судя по всему
Пусть очередь такая: ABCD, где A это голова, D Это хвост. Судя по всему, в каждом элементе поле next указывает на соседний элемент, котоый ближе к хвосту.Тогда C.next указывает на D. Теперь мы в хвост добавляем E, значит надо сделать так, чтобы D.next указыывало на E. Каким образом? Надо написать так:
C++
1
D.next= адрес E
D, это хвост, tail указывает на хвост очереди. Поэтому можно записать так:
C++
1
tail->next= адрес E
E был создан такой операцией:
C++
1
new Node
Его адрес содержится в переменной Temp, поэтому пишем:
C++
1
tail->next= TEMP
ИТак, мы добились, что D.next указывает на E

Ну, а теперь, коль скоро хвост очереди теперь стал E, меняем значение tail
C++
1
tail= Temp
Других объяснений у меня нет.

Открытым остаётся вопрос, а куда щас указывает D.next? Хорошо бы этому полю, присваивать NULL, раз это хвост очереди, ну да это их уже дело.
Finale
13 / 13 / 1
Регистрация: 12.01.2012
Сообщений: 49
12.01.2012, 01:23     Необходимы пояснения по коду #4
код вообще странный по-моему: tail->next по-видимому указывает на предпоследний элемент, но потом temp присваивается tail и скорее всего оператор = там перегружен. А если так, то и предыдущий и последний элемент равны.
Вы там нигде кода Node не видели?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.01.2012, 01:29     Необходимы пояснения по коду #5
Цитата Сообщение от Finale Посмотреть сообщение
но потом temp присваивается tail и скорее всего оператор = там перегружен.
я тоже сперва пошёл по этому пути, но приглядевшись повнимательнее увидел, что приравниваются друг к другу не элементы типа Node, а указатели на них. То есть нет оснований думать что для Node оператор = перегружен.
Finale
13 / 13 / 1
Регистрация: 12.01.2012
Сообщений: 49
12.01.2012, 01:32     Необходимы пояснения по коду #6
ох, да, точно, спасибо.
Но я продолжаю считать код странным
kdv12
1 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 33
12.01.2012, 09:59  [ТС]     Необходимы пояснения по коду #7
Всем спасибо за ответы ))) Буду изучать.
Finale
13 / 13 / 1
Регистрация: 12.01.2012
Сообщений: 49
12.01.2012, 11:02     Необходимы пояснения по коду #8
Попробуйте найти другие реализации и почитать в википедии, например, о алгоритмах реализации очередей.
это на случай, если этот код всё же странный
kdv12
1 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 33
12.01.2012, 12:09  [ТС]     Необходимы пояснения по коду #9
Цитата Сообщение от Finale Посмотреть сообщение
Попробуйте найти другие реализации и почитать в википедии, например, о алгоритмах реализации очередей.
это на случай, если этот код всё же странный
А подкинуть ссылочку можете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2012, 09:55     Необходимы пояснения по коду
Еще ссылки по теме:

C++ Нужны некоторые пояснения
C++ Нужны пояснения
Вывод в текстовый файл, не могу доработать (код + пояснения) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.01.2012, 09:55     Необходимы пояснения по коду #10
Цитата Сообщение от Finale Посмотреть сообщение
и скорее всего оператор = там перегружен
не, там ничего не перегружено
просто выделяется память для нового узла и полученный адрес записывается в tail->next (в котором был нулевой указатель (в нормальных кодах там нулевой указатель) ), а потом указатель на хвост переставляется на новый элемент
Yandex
Объявления
13.01.2012, 09:55     Необходимы пояснения по коду
Ответ Создать тему
Опции темы

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