С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10

Что не так с этими указателями?

02.09.2016, 09:58. Показов 1168. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет, прошу помощи разобраться в коде. Недавно начал изучать C++ по книге Лафоре. В главе с указателями есть пример со связными списками. Вот его структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct node {
    int data;
    node* next;
};
class linklist{
    private:
        node* first;
    public:
        linklist() {
            first = NULL;
        }
        void add(int);
        void show();
};
Читателю предлагается написать функцию add(int) таким образом, чтобы она добавляла новый элемент в конец списка. Написал свою функцию и для проверки решил спросить у Гугла, нашел эту самую функцию, но не смог в нее. Вот собственно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void linklist::add(int d)         
{   
    node* newlink = new node;          
    node* curr;                                 
    newlink->data = d;                 
 
    if(!first)
    {
        newlink->next = NULL;             
        first = newlink;
    }
 
    for ( curr = first; curr->next != NULL; curr = curr->next);
 
    curr->next = newlink;
    cout << curr->next << "\n";    //это мое
 
    newlink->next = NULL;        
    cout << curr->next << "\n";    //и это
}
Вначале возник вопрос, почему при добавлении первого символа, он не дублируется в списке. Ведь мы добавляем его в строках:
C++
1
2
       
first = newlink;
И здесь:
C++
1
curr->next = newlink;
Решил проверить адреса, на которые ссылаются указатели curr->next (две добавленные мною строки вывода) и при добавлении первого элемента получил разные адреса (что интересно, при добавлении последующих элементов, адреса выводит одинаковые). Объясните, пожалуйста, почему адреса разные, если в этом участке кода:
C++
1
2
3
4
5
curr->next = newlink;
cout << curr->next << "\n";    //это мое
 
newlink->next = NULL;        
cout << curr->next << "\n";    //и это
мы не изменяем указатель curr->next?
И почему всё-таки при добавлении первого элемента он не дублируется?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.09.2016, 09:58
Ответы с готовыми решениями:

Что не так с этими циклами
cout &lt;&lt; &quot;.......................................&quot; &lt;&lt; endl; for ( auto it1 = Mylist1.begin(); it1 != Mylist1.end(); it1++ ) { ...

Что не так с нулевыми указателями?
В новых языках часто от них отказываются(читай: Rust). А что с ними не так? По моему они нужны.

Что не так при работе с указателями?
Здравствуйте! Начинаю изучать работу с указателями. #include &lt;iostream&gt; using namespace std; int fun(int a, int b, long...

5
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
02.09.2016, 10:15
Цитата Сообщение от AJITAC Посмотреть сообщение
Ведь мы добавляем его в строках:
Это не добавление, а назначение если список пуст. Это создание головы списка.
Цитата Сообщение от AJITAC Посмотреть сообщение
почему адреса разные, если в этом участке кода:
Не очень понятно что ты там увидел.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
02.09.2016, 10:28
В обычной ситуации этот алгоритм проходит до конца списка, добавляет новый узел в конец и обнуляет next у нового узла списка. В частном случае, когда ещё нет первого узла, мы его сразу назначаем (по хорошему нужно выйти из функции), далее, как оказывается, мы уже в конце списка, curr == first, first == newlink, поэтому curr->next и newlink->next - это один и тот же указатель, т.е. код
C++
1
2
3
4
5
for ( curr = first; curr->next != NULL; curr = curr->next);
 
curr->next = newlink;
 
newlink->next = NULL;
не имеет смысла для этого частного случая.
1
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
02.09.2016, 10:40  [ТС]
Туплю)
Это понятно:
Цитата Сообщение от Operok Посмотреть сообщение
далее, как оказывается, мы уже в конце списка, curr == first, first == newlink, поэтому curr->next и newlink->next - это один и тот же указатель
А это нет:
Цитата Сообщение от Operok Посмотреть сообщение
т.е. код не имеет смысла для этого частного случая.
Почему не имеет смысла?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
02.09.2016, 10:44
Лучший ответ Сообщение было отмечено AJITAC как решение

Решение

Цитата Сообщение от AJITAC Посмотреть сообщение
Почему не имеет смысла?
Потому что уже было выполнено присваивание newlink->next = NULL, после которого выполняется curr->next = newlink, что в случае добавления первого узла равносильно newlink->next = newlink, а затем снова обнуляем: newlink->next = NULL:
C++
1
2
3
4
5
6
...
newlink->next = NULL;
...
newlink->next = newlink; //потому что curr равен newlink
...
newlink->next = NULL;
1
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
02.09.2016, 11:09  [ТС]
Благодарю, кажется понял)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2016, 11:09
Помогаю со студенческими работами здесь

Работа с указателями: подскажите что я не так делаю
Добрый день Подскажите пожалуйста что в этой программе не так #include &lt;iostream&gt; using namespace std; void...

Переставить цифры числа так чтобы получилось наименьшее число, записанное этими же числами
В данном натуральном числе переставить цифры таким образом что бы получилось найменшое число, записанное этими же числами.

Переставить цифры числа так, чтобы образовалось наименьшее число, записанное этими же цифрами
в данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число ,записанное этими же цифрами

Можно лм так работать со списками и указателями?
Задание: Реализовать ведение списка забронированных и списка купленных билетов в кинозале кинотеатра. Купленный билет содержит следующие...

Объясните, что делать с этими пределами
Объясните как решать эти пределы (номера 3,4,5) Нельзя пользоваться Лопиталем, только &quot;замечательные&quot; пределы.....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru