|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.08.2015, 15:02 | #1 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Серьезные проблемы с связным списком. с++
Код:
Последний раз редактировалось Stilet; 17.08.2015 в 07:14. |
16.08.2015, 15:44 | #2 | ||
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Цитата:
temp = head значит temp->next = head->next то есть первоначально temp->next = указатель на второй добавленный элемент списка (или на ноль, если список состоит только из одной головы) Цитата:
Последний раз редактировалось Stilet; 16.08.2015 в 16:33. |
||
16.08.2015, 16:33 | #3 | |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Цитата:
Да и вообще. Если взять другой пример. Функцию добавления в начало списка. Код:
Последний раз редактировалось MrQuestion; 16.08.2015 в 17:14. |
|
16.08.2015, 17:20 | #4 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Советую взять отладчик и посмотреть как изменяются адреса.
head - фиксированные для всей программы current - каждый раз новый при входе в функцию, но от начала ф-ии до её конца не меняется temp - многократно изменяется в циклах while Код:
Потом это же присваивается и глобальной переменной head. Больше head не меняется и всегда равен этому 12345600 Переменная temp сначала = head, то есть 12345600 Затем в цикле: 1) если у temp (которая сейчас равна head=12345600) есть последователи (то есть если temp->next != 0), то temp = temp->next = адресу последователя, например, 12345611; 2) если у temp (которая сейчас равна head->next=12345611) есть ещё последователи (то есть если temp->next != 0), то temp = temp->next = адресу следуещего последователя, например, 12345622; 3) если у temp (которая сейчас равна head->next->next=12345622) есть ещё последователи (то есть если temp->next != 0), то temp = temp->next = адресу следуещего последователя, например, 12345633; и т.д. пока последователи не кончатся. Как только кончаются последователи в цепочке, то добавляем ещё одного нового к самому последнему Код:
Последний раз редактировалось eoln; 16.08.2015 в 17:23. |
16.08.2015, 17:52 | #5 | ||
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Цитата:
Цитата:
Получается, запись temp = temp->next аналогична записи temp = head->next. Но что за адрес хранится в head->next? Там current->next или, вообще, что? Каким образом temp->next получает адрес следующего элемента? Последний раз редактировалось MrQuestion; 16.08.2015 в 17:56. |
||
16.08.2015, 18:20 | #6 | ||||
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Цитата:
Допустим, head- это телефонная книга, temp - это ксерокопия этой книги. И head и temp будут указывать на одних и тех же абонентов. Цитата:
для второй так: Код:
Код:
Код:
и вот чтобы не писать для каждой итерации всё больше и больше кода, на каждом проходе делают замену. Заменяют temp= temp->next. В итоге получаем краткую запись как в программе Цитата:
Цитата:
Последний раз редактировалось eoln; 16.08.2015 в 18:24. |
||||
16.08.2015, 19:07 | #7 | ||
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Цитата:
И в присвоении head = current происходит не присвоение head->next = current->next, а head->next = current? Если не трудно, вы могли бы описать схему и поочередность присвоений? Что к чему конкретно присваивается и что на что указывает. Я не понимаю. Цитата:
Последний раз редактировалось MrQuestion; 16.08.2015 в 19:20. |
||
16.08.2015, 23:28 | #8 | ||||
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Цитата:
current вообще записывается в самом конце процедуры, Это новый указатель на элемент. До самого конца на него ничего не указывает и ничего с ним не связано, и сам он ни с чем не связан. Тут вообще нет понимания что такое указатель. head/current/temp - это не объекты класса, это просто числа, набор цифр, адрес по которому можно найти объект. Что-то типо GPS-координат. Если написано head = current, то это значит что head->next = current->next head->a= current->a head->b= current->b Но опять в 6-ой раз скажу, что это происходит лишь однажды head=current выполняется всего лишь один раз за всё время когда список вообще пуст. Больше эта строка не выполняется никогда. В любое другое время в current уже другой адрес. Цитата:
Код:
Цитата:
Цитата:
И ещё раз советую включить пошаговую отладку и посмотреть какие значения принимают head/current/temp. Это всё после прочтения о том как устроены динамические списки. |
||||
17.08.2015, 13:32 | #9 |
Пользователь
Регистрация: 16.08.2015
Сообщений: 40
|
Да! Я понял! Я понял, как они работают! Воспользовался отладочной печатью и всё понял! Ха-ха-ха! Нужно было включать мозги с самого начала! Спасибо eoln! Большое спасибо!
|
17.08.2015, 19:47 | #10 |
t45t
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
|
Если автор разобрался, то теперь вопросы у меня..., естественно по теме)
Здесь в качестве списка создаются связанные экземпляры класса? Просто мы для создания связанного списка писали примерно вот так: Код:
Плюс вопрос по коду из первого поста: Разве при выводе списка не нужно писать так: Код:
from dark to light)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Стековый калькулятор, чистый Си, реализовать его со связным списком | anna27 | Помощь студентам | 4 | 09.05.2013 23:31 |
проблемы с Char-списком | Caged | Помощь студентам | 0 | 25.12.2011 18:02 |
Операции над многочленами, заданными списком свомх коэффициентовОперации над многочленами, заданными списком свомх коэффициентов | lelicki_bolicki | Общие вопросы по Java, Java SE, Kotlin | 1 | 06.12.2011 22:07 |
проблемы со связным списком с++ (Borland) | adwaer | Помощь студентам | 0 | 15.04.2009 16:23 |
проблемы со связным списком с++ (Borland) | adwaer | Помощь студентам | 0 | 15.04.2009 16:22 |