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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kdv12
1 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 33
#1

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

12.01.2012, 00:49. Просмотров 530. Ответов 9
Метки нет (Все метки)

Здравствуйте знатоки 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5408 / 1791 / 327
Регистрация: 10.12.2010
Сообщений: 5,293
Записей в блоге: 3
12.01.2012, 00:59     Необходимы пояснения по коду #2
Цитата Сообщение от kdv12 Посмотреть сообщение
Что это за переменная tail?
Это указатель на хвост очереди (т.е. на последний элемент). Должно быть так.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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++
Когда необходимы определения членов-перемещения 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     Необходимы пояснения по коду
Ответ Создать тему
Опции темы

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