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

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

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

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

02.09.2016, 09:58. Просмотров 166. Ответов 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?
И почему всё-таки при добавлении первого элемента он не дублируется?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 09:58     Что не так с этими указателями?
Посмотрите здесь:

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

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

Не могу что-то понять с указателями - C++
Объясните мне,пожалуйста, почему когда я пишу так: void main() { char arr=&quot;erbb45&quot;; char *parr = &amp;arr; cout &lt;&lt; hex; ...

переделать код, что б было с указателями - C++
помогите пожалуйста, нужно не использовать а все сделать через указатели #include &quot;stdafx.h&quot; #include &quot;math.h&quot; #include &quot;time.h&quot; ...

Что использовать с указателями? 0, NULL, nullptr? - C++
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про...

Union с явными указателями или void*- что выбрать? - C++
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о....

Не могу понять, что означает данная операция с указателями - C++
вот такой код #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int rrr2 (int **p) {return ((**p-1)***p);}; ...

Нюансы работы с указателями: объяснить, что происходит в заданном фрагменте кода - C++
Всем доброго времени суток! Я не до конца разобрался в данной теме. К примеру, есть такой кусок программы: ... int N; int...

Список: Что не так с выводом списка, потому что выводится какой-то мусор? - C++
#include &lt;iostream&gt; using namespace std; struct point { int data;//информационное поле-это даннные объявленного или используемого...

что не так? - C++
выполняется бесконечно, почему? #include &lt;iostream&gt; using namespace std; int matrix,i,j; int main() {

Что не так? - C++
Помогите пожалуйста задание в документе вот код что в нём не так? #include&lt;iostream&gt; #include&lt;math.h&gt; #include&lt;iomanip&gt; ...

Что не так? - C++
#include &lt;iostream &gt; #include &lt;time.h&gt; using namespace std; void main() { srand(time(0)); int const row = 9 , col = 8 ; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hikari
Хитрая блондиночка $)
1447 / 954 / 285
Регистрация: 21.12.2015
Сообщений: 3,798
02.09.2016, 10:15     Что не так с этими указателями? #2
Цитата Сообщение от AJITAC Посмотреть сообщение
Ведь мы добавляем его в строках:
Это не добавление, а назначение если список пуст. Это создание головы списка.
Цитата Сообщение от AJITAC Посмотреть сообщение
почему адреса разные, если в этом участке кода:
Не очень понятно что ты там увидел.
Operok
139 / 137 / 40
Регистрация: 15.02.2015
Сообщений: 418
Завершенные тесты: 2
02.09.2016, 10:28     Что не так с этими указателями? #3
В обычной ситуации этот алгоритм проходит до конца списка, добавляет новый узел в конец и обнуляет 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;
не имеет смысла для этого частного случая.
AJITAC
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
02.09.2016, 10:40  [ТС]     Что не так с этими указателями? #4
Туплю)
Это понятно:
Цитата Сообщение от Operok Посмотреть сообщение
далее, как оказывается, мы уже в конце списка, curr == first, first == newlink, поэтому curr->next и newlink->next - это один и тот же указатель
А это нет:
Цитата Сообщение от Operok Посмотреть сообщение
т.е. код не имеет смысла для этого частного случая.
Почему не имеет смысла?
Operok
139 / 137 / 40
Регистрация: 15.02.2015
Сообщений: 418
Завершенные тесты: 2
02.09.2016, 10:44     Что не так с этими указателями? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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;
AJITAC
0 / 0 / 0
Регистрация: 09.07.2013
Сообщений: 10
02.09.2016, 11:09  [ТС]     Что не так с этими указателями? #6
Благодарю, кажется понял)
Yandex
Объявления
02.09.2016, 11:09     Что не так с этими указателями?
Ответ Создать тему
Опции темы

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