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

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

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

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

12.01.2012, 00:49. Просмотров 544. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2012, 00:49     Необходимы пояснения по коду
Посмотрите здесь:

Требуются пояснения по коду - C++
Приветствую. Штурмую тут методичку, и некоторые моменты не ясны: class person { int age; ... public: … void...

Необходимы комментарии к коду - C++
Можна коментарии к коду #include <windows.h> #include <iostream> using namespace std; int arr = { { 0, 0, 0, 0, 0,...

Пишем рогалик: пояснения по коду и его критика - C++
Здравствуйте! Сегодня сел писать рогалик, в процесе возникло несколько вопросов (в виде коментариев в коде): main.cpp ...

Нужны пояснения - C++
Читаю "С++ руководство для начинающих" Герберта Шилдта. Дочитал до "передача аргументов командной строки функции main()". То ли я глупый,...

Пояснения условия - C++
Пожалуйста поясните следующую задачу. (Прошу решения не предлагать, мне нужно самому решить) ...

Пояснения кода - C++
Вариант 5. Сформировать одномерный массив. Удалить из него K элементов, начиная с заданного номера, добавить K элементов, начиная с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5476 / 1842 / 343
Регистрация: 10.12.2010
Сообщений: 5,433
Записей в блоге: 3
12.01.2012, 00:59     Необходимы пояснения по коду #2
Цитата Сообщение от kdv12 Посмотреть сообщение
Что это за переменная tail?
Это указатель на хвост очереди (т.е. на последний элемент). Должно быть так.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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++
#include <stdio.h> void main() { int n, a, b, c, n1; scanf("%d", &n); a=0; c=0; b=1; n1=n;

Нужны некоторые пояснения - C++
При выполнении программы есть область 20 на 20. 1) Почему при движении вправо или влево, после того, как заканчивается строчка, курсор...

Conversion by constructor , нужны пояснения - C++
Здравствуйте. Смотрю я, что пишут об этом Conversion by constructor, вижу одно: Вот, думаю, сейчас как заставлю компилятор...

Нужны пояснения по вложенным классам - C++
задался вот таким вопросом, почему не получается объявить вложенный класс следующим образом? #include <iostream> using namespace std; ...


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

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

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