Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Всем привет! Читаю статью где объясняется односвязный список. из статьи Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Приведенная ниже функция slstore() создает односвязный список путем помещения каждого очередного элемента в конец списка. В качестве параметров ей передаются указатель на структуру типа address, содержащую новую запись, и указатель на последний элемент списка. Если список пуст, указатель на последний элемент должен быть равен нулю. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Я не могу понять, почему в качестве указателя на последний элемент списка, передается указатель на указатель [**last], а не просто указатель [*last]? Заранее спасибо за любые подсказки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 00:15 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_Gпочему в качестве указателя на последний элемент списка, передается указатель на указатель [**last], а не просто указатель [*last]? Потому что его изменять надо. А для этого его надо передавать по ссылке. Что и делается. RTFM способы передачи параметров. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 00:32 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMaximuS_Gпочему в качестве указателя на последний элемент списка, передается указатель на указатель [**last], а не просто указатель [*last]? Потому что его изменять надо. А для этого его надо передавать по ссылке. Что и делается. RTFM способы передачи параметров. Спасибо! Сорри, я не вьезжаю... Я вот что-то такое пытаюсь соорудить, но естественно не получается: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Вот это явно бред Код: plaintext 1. Я даже не понимаю, почему тут Код: plaintext 1. объявлено, [struct address *i], а не [address *i]. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 00:51 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_G Код: sql 1. Должно быть Код: sql 1. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 01:09 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ага, так яснее немного. Если объект создается так: Код: plaintext 1. под него сразу выделяется память если так Код: plaintext 1. то выделяется 1 байт на указатель, а под сам объект не выделяется, так? Я просто пытаюсь понять, зачем создавать указатель на объект и передавать указатель на указатель, а не создать объект и передать просто указатель на него? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 01:20 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Элементы списка не могут быть созданы в виде локальных экземпляров структуры (так как у них время жизни - до окончания блока {} в котором они объявлены). Это должны быть выделенные в динамической памяти (т.е. глобальные) экземпляры (через new если это в С++). А new возвращает указатели - поэтому список работает с указателями. Вам надо объявить указатель на последний элемент списка, инициализированным 0, и передавать его адрес вторым аргументом в slstore. А первым аргументом - передавать созданный через new экземпляр элемента списка (перед этим при необходимости заполнить его поля нужными данными). Правда функция slstore немного корявенько написана, можно сократить кое-что, добавтьь пару проверок, но в принципе - все должно работать. ЗЫ. Указатель занимает не 1 байт, а машиное слово - обычно 4 или 8 байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 01:55 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, Очевидно, что функция должна поменять этот указатель при модификации списка. Чтобы это было возможно, нужно передать указатель по адресу, т.е. получится указатель на указатель. На самом деле конечно так уже никто списки не делает, принято отделять реализацию списка от хранимых в списке данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 09:55 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Вообще, это С-шный код, на С++ этот указатель на указатель был бы ссылкой на указатель, и все было бы проще. Это в наивной копии С-шного кода так бы было. А в нормальной реализации списка обе переменные (указатели на голову и хвост) были бы спрятаны в класс, и функция была бы методом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 10:12 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_G, Элементы списка не могут быть созданы в виде локальных экземпляров структуры (так как у них время жизни - до окончания блока {} в котором они объявлены). Это должны быть выделенные в динамической памяти (т.е. глобальные) экземпляры (через new если это в С++). А new возвращает указатели - поэтому список работает с указателями. Вам надо объявить указатель на последний элемент списка, инициализированным 0, и передавать его адрес вторым аргументом в slstore. А первым аргументом - передавать созданный через new экземпляр элемента списка (перед этим при необходимости заполнить его поля нужными данными). Правда функция slstore немного корявенько написана, можно сократить кое-что, добавтьь пару проверок, но в принципе - все должно работать. ЗЫ. Указатель занимает не 1 байт, а машиное слово - обычно 4 или 8 байтов. Спасибо большое за разъяснение! Почему нужно создавать именно указатель я понял теперь, я просто не додумался, что элементы созданные не через new (я так понимаю их можно называть локальными экземплярами структуры), будут удалены при завершении блока. Сейчас дальше пробую по порядку. Например, у меня есть уже какие-то элементы списка, и я хочу новый добавить. Тут я так понимаю, я делаю так А первым аргументом - передавать созданный через new экземпляр элемента списка (перед этим при необходимости заполнить его поля нужными данными). Код: plaintext 1. 2. На второй строчке получаю ошибку - Expression must be a modifiable value. Вам надо объявить указатель на последний элемент списка, инициализированным 0, и передавать его адрес вторым аргументом в slstore. То есть просто указатель объявить на структуру? Или ему надо как-то присвоить адрес последнего элемента списка? И как его инициализировать нулем? Так? Код: plaintext 1. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:52 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MasterZivВообще, это С-шный код, на С++ этот указатель на указатель был бы ссылкой на указатель, и все было бы проще Спасибо за комментарий! Я учу именно C++, можете показать, как это было бы реализовано на этом языке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:54 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА первым аргументом - передавать созданный через new экземпляр элемента списка (перед этим при необходимости заполнить его поля нужными данными). Код: plaintext 1. 2. На второй строчке получаю ошибку - Expression must be a modifiable value. Вам надо объявить указатель на последний элемент списка, инициализированным 0, и передавать его адрес вторым аргументом в slstore. То есть просто указатель объявить на структуру? Или ему надо как-то присвоить адрес последнего элемента списка? И как его инициализировать нулем? Так? Код: plaintext 1. Код: plaintext 1. 2. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 13:18 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Спасибо! Anatoly Moskovsky// уже забыли что было в соседних ваших темах ?:) Скорее не до конца разобрался). Я думал использовать strcpy , но не понимал почему. Еще раз вернусь к этой теме, когда закончу с этими списками :) Я так понимаю, так как Вы написали Код: plaintext 1. и так как я Код: plaintext 1. 2. разницы нету? Теперь все таки остался вопрос, который я не могу понять, это зачем передавать один объект по указателю (новый объект), а второй объект (последний в списке) как-то через указатель на указатель? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. И почему в функции slstore параметры описаны как struct address , а не просто address , тоже не ясно :(. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:16 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_GСпасибо! Я так понимаю, так как Вы написали Код: plaintext 1. и так как я Код: plaintext 1. 2. разницы нету? Здрасте. В первом случае ничего не создается, просто объявлен пустой указатель. Во втором - создается объект в куче, и единственный указатель на него затирается нулем, т.е. - это утечка памяти. авторТеперь все таки остался вопрос, который я не могу понять, это зачем передавать один объект по указателю (новый объект), а второй объект (последний в списке) как-то через указатель на указатель? Второй аргумент - это не последний объект, а сам указатель на него. Функция его изменяет - поэтому передается адрес. авторИ почему в функции slstore параметры описаны как struct address , а не просто address , тоже не ясно :(. struct это синтаксис С, а С++ разрешает его опускать при объявлении переменных на основе ранее объявленных структур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 15:20 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Прочтите уже наконец какую-нибудь книгу. Сначала по С, по том по С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 15:31 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПрочтите уже наконец какую-нибудь книгу. Сначала по С, по том по С++. Мне кажется, у Вас уже закончилось терпение, хотя я почти разобрался. Вот здесь Anatoly MoskovskВторой аргумент - это не последний объект, а сам указатель на него. Функция его изменяет - поэтому передается адрес. Вы вот это имели ввиду (сделал для себя проще пример для понимания)? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. До вызова функции change_object() , указатель info_new указывает на объект с именем "A" - cout<<info_new->name == "A" , после вызова, указывает на объект с именем "B" - cout<<info_new->name == "B" . struct это синтаксис С, а С++ разрешает его опускать при объявлении переменных на основе ранее объявленных структур. Ага, сорри тогда за глупый вопрос. Я учу С++, и в C вообще не заинтересован. Здрасте. В первом случае ничего не создается, просто объявлен пустой указатель. Во втором - создается объект в куче, и единственный указатель на него затирается нулем, т.е. - это утечка памяти. М-да, это я что-то тормознул :). А разница между такими объявлениями: Код: plaintext 1. и Код: plaintext 1. большая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 18:46 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
PS. С++ я учу не для того, что бы программировать на нем, хотя что-то не сложное не исключено. Я работаю продакт менеджером, немного пишу на JavaScript, экономическое образование. Что бы иметь более профессиональные навыки, пошел еще учиться в академию "ШАГ", хотя особой надобности нет, там и познакомился с С++. К сожалению, книги читать по С++, совсем времени нет, еле успеваю делать домашнее задания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 18:52 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Итак, я кажется все понял :). Напишу для таких же тугодумов как я, если кто-то будет пытаться выучить похожее. И так, почему передается последний элемент через указатель на указатель. Это можно понять по следующему примеру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 01:54 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА разница между такими объявлениями: Код: plaintext 1. и Код: plaintext 1. большая? Если это объявление локальной переменной, то без инициализации там случайное число (мусор). Если это неинициализированая глобальная переменая, то там будет 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 02:14 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Прежде чем делать так Код: plaintext 1. надо сначала удалить старый объект, иначе бедет утечка памяти Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 02:18 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Насколько я смог узнать, чем полезен односвязный список, так это тем, что он позволяет вставить новый объект на любую позицию, и при этом изменить только 2 указателя (в объекте, на место которого вставляется новый объект, и в новом объекте). Для того, что бы вставить объект в массив объектов, нужно двигать все элементы начиная с позиции, на которую вставляется объект. Вот моя реализация функции добавления объекта на любую позицию, кроме последней и первой (это допилю завтра) - putInMiddle . Думаю фукнция кривовата, но написана самостоятельно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 02:20 |
|
||
|
Простой вопрос по односвязным спискам
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_GА разница между такими объявлениями: Код: plaintext 1. и Код: plaintext 1. большая? Если это объявление локальной переменной, то без инициализации там случайное число (мусор). Если это неинициализированая глобальная переменая, то там будет 0. Спасибо большое за объяснения! Anatoly Moskovskyнадо сначала удалить старый объект, иначе бедет утечка памяти Спасибо за подсказку, я еще просто не привык сразу видеть такое, когда сфокусирован на том, что бы просто сделать пример, а не полноценную программу. Удачи! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 11:07 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38049787&tid=2020651]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
186ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 267ms |
| total: | 557ms |

| 0 / 0 |
