555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
1 | |
Поменять местами два элемента односвязного списка21.11.2014, 19:19. Показов 13688. Ответов 28
Метки нет (Все метки)
Дан односвязный список. Требуется напечатать исходный список. Поменять местами два элемента списка, номера которых введёт пользователь с клавиатуры. Напечатать получившийся список.
0
|
21.11.2014, 19:19 | |
Ответы с готовыми решениями:
28
Поменять два элемента односвязного списка Поменять местами два элемента двусвязного списка Поменять местами два элемента двусвязного списка и удалить из него указанный элемент Поменять местами последний и предпоследний элементы односвязного списка |
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
21.11.2014, 19:58 | 2 | |||||
Сообщение было отмечено Dennis Ritchie как решение
Решение
1
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
21.11.2014, 20:10 [ТС] | 3 |
Nosey, огромное спасибо. А не могли бы вы прокомментировать код, чтобы легче разбираться было?
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
21.11.2014, 20:17 | 4 |
Dennis Ritchie, Да, могу.
Что непонятно? Или зачем вам это задание понадобилось? Чтобы понять что рассказывать
0
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
21.11.2014, 20:26 [ТС] | 5 |
Учусь в ВУЗ'е. Преподаватель уже замучил. Я знаю, что если я ему завтра покажу такой код, то он закидает меня вопросами с ног до головы. И в итоге скажет, чтобы я переписал код более просто или же объяснил работу этого кода.
В общем, желательно прокомментировать в коде код структуры и код класса. Чем больше прокомментируете, тем лучше. Этот код поможет не только мне, если я смогу разобраться.
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
|
21.11.2014, 20:29 | 6 |
Когда речь идет о списках, хранящих какие-то "полезные данные", задание "поменять местами два элемента" - неоднозначно.
* Во-первых, в списке "поменять местами два элемента" можно путем перецепления ссылок на узлы списка. "Полезные данные" останутся на прежних местах в памяти, но порядок физических узлов в списке изменится. * Во-вторых, в списке "поменять местами два элемента" можно просто путем обмена "полезных данных", хранящихся в узлах, оставив ссылки нетронутыми. В таком случае наоборот, "полезные данные" обменяются в памяти, но порядок физических узлов в списке останется прежним. С точки зрения распечатки содержимого списка, результат будет одним и тем же в обоих случаях. Однако побочные эффекты этих вариантов различаются. Например, если у меня есть два посторонних внешних указателя на обмениваемые узлы списка, то в первом способе "полезные данные", видимые через эти указатели, останутся прежними. А во втором способе они тоже обменяются. О каком именно обмене идет речь? Второй способ, понятное дело, применим к любому контейнеру. Поэтому когда в задаче явно говорят о списке, то это зачастую является "намеком" именно на первый способ.
0
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
21.11.2014, 20:34 [ТС] | 7 |
Я это сам пытался понять, но так и не понял. Я предполагаю, что элементы нужно поменять путём перецепления ссылок на узлы списка.
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
21.11.2014, 22:03 | 8 | |||||
Сообщение было отмечено Dennis Ritchie как решение
Решение
Давно я своих листов не писал )))
Думаю вы разберётесь и без комментариев.
0
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
21.11.2014, 22:39 [ТС] | 9 |
Спасибо за код ))) Отличная работа!
Не знаю насчёт, как разберусь, но из отладчика придётся долго не вылезать...
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
21.11.2014, 22:52 | 10 |
Dennis Ritchie, Очень советую приложить к отладчику ручку и бумажку и всё станет легче.
0
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
21.11.2014, 22:57 [ТС] | 11 |
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
||||||
21.11.2014, 23:37 | 12 | |||||
Я бы реализовал ваш 'swapListNodeByIndex' так. Мой код короче и более трудночитаем. Сплошные премущества!
2
|
Nosey
|
21.11.2014, 23:49
#13
|
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
|
22.11.2014, 00:44 | 14 |
... но в общем и целом работа со списком через двойной указатель (как 'MineListNode **') позволяет вам в большинстве случаев избавиться о необходимости рассматривать работу с самым первым элементом списка, как особую ситуацию.
Вот в данном случае в коде Nosey эти 'if (prevIndex1Node == nullptr)' приходится выписывать именно потому, что первый элемент необходимо обрабатывать особо. А вот в моем варианте таких 'if'ов нет.
1
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
22.11.2014, 01:31 | 15 |
TheCalligrapher, Да, спасибо большое. Я пока новенький в плюсах, и теперь ещё один фокус с "**" в голову положил. Спасибо
0
|
22.11.2014, 01:58 | 16 |
Nosey, абсолютно неграмотный свап для списка. А если у меня в списке хранятся структуры по несколько мегабайт? Так и будешь копировать их по значению swapом? Не для того указатели и списки придумали!
короче, тему не читал. Прочёл до 6го коммента - полностью с ним согласен.
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||
22.11.2014, 02:27 | 17 | |||||
Kuzia domovenok
Не по теме:
И я что-то не понимаю, где же копирование при свапе? Я даже проверился, вдруг я и правда что-то не учёл А если же вы, не про свап говорили, а про
0
|
22.11.2014, 11:02 | 18 |
как-бэ преподаватель ей это и задал. Хотел бы препод увидеть банальное swap(a,b) - никакой бы "задачи" из этого не выросло. В этом и суть изучения списков - программист должен понимать их настолько, чтобы самому ими пользоваться легко было.
+ ты преувеличиваешь сложность списков. В школьном курсе Си они изучаются не более чем через полгода после начала изучения программирования с полного нуля. + возвращаясь к тому, что программист должен понимать списки. У списков, в отличие от массивов, есть очень важное свойство. В них операции вставки и удаления никогда не приводят к появлению недействительных итераторов, указателей и ссылок (если они не относятся к удаляемым элементам). В общем случае операции вставки и удаления в блоковых контейнерах(массивах, векторах...) могут привести к тому, что все итераторы, указатели и ссылки станут недействительными. А в списках - нет. Твоя идея со свапом всё это портит! Добавлено через 2 минуты тута
0
|
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
|
|
22.11.2014, 12:01 [ТС] | 19 |
Nosey, препод быстро сломал вашу программу. Попробуйте ввести размер списка c = 2 и поменять нулевой элемент с первым. С функцией от TheCalligrapher всё работает, но я ещё не показывал эту программу.
0
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||||||
22.11.2014, 17:19 | 20 | ||||||||||
Dennis Ritchie,
Извиняюсь, забыл эту ситуацию рассмотреть.
Kuzia domovenok, Вы про первую версию, ну и стоит писать вот так и отдавать на откуп использующему:
2
|
22.11.2014, 17:19 | |
22.11.2014, 17:19 | |
Помогаю со студенческими работами здесь
20
Поменять местами два элемента в массиве Поменять местами два элемента массива Поменять местами два элемента массива Поменять местами два элемента массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |