![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#21
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
всё-таки хочу разобраться и таким вариантом : как, после сотировки строк по убыванию их длины, удалить самые короткие, идя к ним от головы списка? (т.е. считаем, что самые короткие в конце списка). Как предусмотреть, если самых коротких меньше 5? (например вывести сообщение о том, что нужного кол-ва строк нет)
|
volvo |
![]()
Сообщение
#22
|
Гость ![]() |
С односвязным списком - только через извращение, которое убивает все преимущества использования списков: первым проходом пробегать по всему списку и считать, сколько элементов в нем есть, и вторым проходом - пропускать первые N - 5 элементов, а остальные удалять...
Но это делай сама, я ЭТО делать не буду. |
18192123 |
![]()
Сообщение
#23
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Я хочу добиться того, чтобы после удаления 5 элементов (остальные элементы расположены в порядке возрастания их длины), оставшиеся элементы были расположены в обратном порядке (т.е. в порядке убывания длины).
Как это будет выглядеть? И куда в этом случае привязать проверку на наличие пяти самых коротких строк? И ещё такой вопрос: void sort(LIST **first) - почему мы в эту ф-ю передаём указатель на указатель на голову списка? Сообщение отредактировано: 18192123 - |
18192123 |
![]()
Сообщение
#24
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Я хочу добиться того, чтобы после удаления 5 элементов (остальные элементы расположены в порядке возрастания их длины), оставшиеся элементы были расположены в обратном порядке (т.е. в порядке убывания длины). Как это будет выглядеть? Это я поняла. А вот с остальными вопросами не разобралась....(про проверку на наличие 5 коротких и про void sort(LIST **first)) Сообщение отредактировано: 18192123 - |
volvo |
![]()
Сообщение
#25
|
Гость ![]() |
Цитата почему мы в эту ф-ю передаём указатель на указатель на голову списка? Потому, что если мы будем передавать просто указатель на голову списка, то изменить его (если это понадобится) мы не сможем... Это получается некоторый аналог Var-параметра в Паскале...В С++ это очень просто решается с помощью ссылок, но в чистом С ссылки не введены, поэтому приходится передавать указатель на <что-то что может меняться> |
18192123 |
![]()
Сообщение
#26
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
объясните пожалуйста некоторые моменты:
1) о сортировке
здесь L = *first - голова, p = L -> next - элемент, следующий за головой, а что подразумевается под L -> next и p? Как я понимаю, операциями L = L -> next и p = p -> next мы переходим к следующим элементам,которые нужно сравнивать, да? 2)почему мы ставим здесь взятие адреса?
3) здесь мы печатаем отсортированный по возрастанию длины список:
печатаем начиная с головы p = root и заканчивая р, в процессе передвигаясь от головы к концу списка, так? тогда р - у нас последний элемент списка? или тут другое? 4) момент с удалением 5-ти первых:
почему у нас тут такое условие завершения цикла? 5) и последнее - почему при печати оставшегося списка мы использует таокй цикл
? Объясните пожалуйста! Добавлено через 19 мин. 2) вопрос отпал. а вот с остальным - объясните пожалуйста. Сообщение отредактировано: 18192123 - |
volvo |
![]()
Сообщение
#27
|
Гость ![]() |
Давай по порядку:
1) организацию циклов в С знаешь? Я имею в виду, синтаксис оператора цикла? for(начальное_присвоение;условие_окончания;и зменение_на_каждой_итерации) { собственно_операторы_тела_цикла; } где начальное_присвоение - делается один раз перед началом цикла; условие_окончания - проверяется после завершения каждой итерации изменение_на_каждой_итерации - делается после завершения итерации ПЕРЕД проверкой условия_окончания причем любой (!!!) из этих параметров может отсутствовать (моогут, кстати, отсутствовать и 2 и все 3 - тогда цикл будет "вечным", и выходе из него возможен будет только через break)... А теперь с учетом этого - смотри, что происходит:
2) Цитата почему мы ставим здесь взятие адреса? Потому, что я объяснил, зачем передается указатель на указатель, а чтобы передать его - надо взять адрес указателя...3) Цитата здесь мы печатаем отсортированный по возрастанию длины список: Опять же - смотри комментарии, и постарайся разобраться в принципе работы оператора цикла, я не могу каждый раз писать такие объемные комментарии...
4) Цитата почему у нас тут такое условие завершения цикла? Условие завершения может быть любым правильным логическим условием, в отличие от оператора For в Паскале... Что делается здесь: предварительно я n установил в 0, правда? После каждой итерации (т.е., после удаления очередного элемента) n увеличивается на 1, а так как нам надо удалить ЛИБО первые 5 элементов, ЛИБО, если их всего меньше 5, то все - мы ставим операцию AND, и как только одно из условий НЕ выполняется (или уже удалили 5 элементов и n = 5, или достигли конца цикла, и p = NULL) - то цикл завершается... 5) Цитата почему при печати оставшегося списка мы использует таокй цикл я выше написал, что любой из параметров цикла может отсутствовать... Здесь отсутствует третий параметр - изменение значения после каждой итерации... Почему - потому, что это делается внутри цикла, и нет необходимости делать это еще раз...for(p = root; p; ) { в отмеченной строке происходит следующее: сначала выполняется действие в скобках, т.е. T = p, потом в p заносится новое значение, равное T -> next, то есть, фактически, старое p запоминается в переменной T, а потом p продвигается на следующий элемент списка... |
18192123 |
![]()
Сообщение
#28
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
volvo, большое спасибо! теперь всё поняла!
![]() |
18192123 |
![]()
Сообщение
#29
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Возник ещё вопрос:
Здесь при сортировке строк по длине мы фактически работаем с содержимым информационных полей каждого элемента, верно? а можно сделать так, чтобы не строки копировать из одной области памяти в другую, а вместо этого изменять указатели? |
volvo |
![]()
Сообщение
#30
|
Гость ![]() |
Можно, только код будет больше по размеру... Не забывай, у тебя односвязные списки, то есть, для того, чтобы пройти к предыдущему (менять-то указатель с предыдущего на новое значение надо?) тебе придется пробегать еще раз по списку с самого начала...
|
18192123 |
![]()
Сообщение
#31
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Можно, только код будет больше по размеру... Не забывай, у тебя односвязные списки, то есть, для того, чтобы пройти к предыдущему (менять-то указатель с предыдущего на новое значение надо?) тебе придется пробегать еще раз по списку с самого начала... ".....(менять-то указатель с предыдущего на новое значение надо?)" - думаю, надо. Можешь объяснить, как тогда код изменится? |
18192123 |
![]()
Сообщение
#32
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#33
|
Гость ![]() |
Ты сама просила
![]() void sort(LIST **first) { |
18192123 |
![]()
Сообщение
#34
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Ты сама просила ![]() Спасибо! Общую идею поняла...Попробывала переделать на свой лад....Идея такая: по заданию мне нужно расположить строки по убыванию длины. Функцией sort1 я это и делаю. Вывожу результат. Одна часть задания выполнена. Теперь сортирую наоборот (sort), после удаляем 5 самых коротких(они теперь впереди), ещё раз сортируем (т.к. по заданию нужно получить строки, упорядоченные по убыванию длины). Вывожу конечный результат. Проблема в том, что в файл выводится список отсортированный, но не тот, что нужен мне..... Вот так, например: Исходные данные qwert tyuri vbncgf aaaaaaaaaaaaaaaaaaaaa zxc vbn fgh qwerty qwerty zxc sd a qwervbn zasd cvbnnnnnn qwe rty uioopl nm Результат qwert tyuri vbncgf qwervbn zasd zxc sd a --- -------- Не пойму, откуда такие результаты?!
Сообщение отредактировано: 18192123 - |
volvo |
![]()
Сообщение
#35
|
Гость ![]() |
Сорри, я больше в эту тему НЕ отвечаю! Я тебе привел работающую функцию сортировки, на отладку которой ушло больше 2-х часов, ты ее полностью перековеркала, и теперь тебя не устраивает результат?
![]() Извини, но функции твои, вот и разбирайся, как они работают сама (а они НЕ работают, чтобы в этом убедиться достаточно вывести на экран содержимое списка ПЕРЕД первой сортировкой, и ПОСЛЕ нее)... Сообщение отредактировано: volvo - |
18192123 |
![]()
Сообщение
#36
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
И всё-таки...Объясни пожалуйста: А для чего вводятся *prv_L, *prv_p? И для чего эти два цикла? Почему в циклах используется условие prv_L -> next != L и prv_p -> next != p? И ещё: почему мы вновь должны возвращаться к началу циклов (goto start_over; ) и когда этот механизм возврата закончит свою работу? Сообщение отредактировано: 18192123 - |
![]() ![]() |
![]() |
Текстовая версия | 19.02.2025 19:57 |