IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Односвязные линейные списки, Си
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Дан текстовый файл. Строки этого файла расположить в порядке убывания их длины и удалить пять самых коротких из них.
Для размещения в памяти содержимого файлов использовать односвязные линейные списки.

Предполагаю заносить каждую строку в одно поле списка, но не знаю, как это сделать именно со строкой и сколько выделять памяти.

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Давай по порядку:

1) организацию циклов в С знаешь? Я имею в виду, синтаксис оператора цикла?
for(начальное_присвоение;условие_окончания;и
зменение_на_каждой_итерации) {
собственно_операторы_тела_цикла;
}

где
начальное_присвоение - делается один раз перед началом цикла;
условие_окончания - проверяется после завершения каждой итерации
изменение_на_каждой_итерации - делается после завершения итерации ПЕРЕД проверкой условия_окончания

причем любой (!!!) из этих параметров может отсутствовать (моогут, кстати, отсутствовать и 2 и все 3 - тогда цикл будет "вечным", и выходе из него возможен будет только через break)...

А теперь с учетом этого - смотри, что происходит:


/*
ВНЕШНИЙ цикл

Поскольку first передается как указатель на указатель
(причину я объяснял выше), то L присваиваем значению
разыменованного first (т.е. изначально L = указателю на
голову списка)

Условие окончания внешнего цикла - (L->next) подразумевает НЕравенство
этого значения нулю... То есть, как только значение L->next станет NULL, цикл завершится...

После обработки одной итерации продвигаемся по списку, путем L = L -> next
*/
for(L = *first; L -> next; L = L -> next)

/*
ВНУТРЕННИЙ цикл
изначально p = L -> next
условие окончания: закончится цикл - когда p будет нулевым
продвижение - понятно как осуществляется...
*/
for(p = L -> next; p; p = p -> next)


2)
Цитата
почему мы ставим здесь взятие адреса?
Потому, что я объяснил, зачем передается указатель на указатель, а чтобы передать его - надо взять адрес указателя...

3)
Цитата
здесь мы печатаем отсортированный по возрастанию длины список:
Опять же - смотри комментарии, и постарайся разобраться в принципе работы оператора цикла, я не могу каждый раз писать такие объемные комментарии...

/*
изначально p = root
окончание - когда p = NULL
продвижение - p = p -> next
*/
for(p = root; p; p = p -> next)
printf("%s\n", p -> number);


4)
Цитата
почему у нас тут такое условие завершения цикла?

Условие завершения может быть любым правильным логическим условием, в отличие от оператора For в Паскале... Что делается здесь: предварительно я n установил в 0, правда? После каждой итерации (т.е., после удаления очередного элемента) n увеличивается на 1, а так как нам надо удалить ЛИБО первые 5 элементов, ЛИБО, если их всего меньше 5, то все - мы ставим операцию AND, и как только одно из условий НЕ выполняется (или уже удалили 5 элементов и n = 5, или достигли конца цикла, и p = NULL) - то цикл завершается...

5)
Цитата
почему при печати оставшегося списка мы использует таокй цикл
я выше написал, что любой из параметров цикла может отсутствовать... Здесь отсутствует третий параметр - изменение значения после каждой итерации... Почему - потому, что это делается внутри цикла, и нет необходимости делать это еще раз...

  for(p = root; p; ) {
printf("%s\n", p -> number);
p = (T = p) -> next; /* <--- вот эту строку ты разобрала, как она работает? */
free(T);
}

в отмеченной строке происходит следующее: сначала выполняется действие в скобках, т.е. T = p, потом в p заносится новое значение, равное T -> next, то есть, фактически, старое p запоминается в переменной T, а потом p продвигается на следующий элемент списка...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Односвязные линейные списки   29.04.2007 0:57
volvo   После прочтения строки из файла, проверяй ее длину…   29.04.2007 1:00
18192123   хочу сделать функцию для расположения строк в поря…   1.05.2007 20:24
volvo   Ты какой путь выбираешь, сразу заносить очередной …   1.05.2007 20:30
18192123   Ты какой путь выбираешь, сразу заносить очередной…   1.05.2007 21:26
volvo   Ну, тогда тебе и карты в руки... Опять изобретение…   1.05.2007 21:46
18192123   Ну, тогда тебе и карты в руки... Опять изобретени…   1.05.2007 21:49
18192123   попыталась написать ф-ю, которая формирует список …   1.05.2007 23:19
volvo   #include <stdio.h> #include <conio.h> …   2.05.2007 0:48
18192123   [code=cpp] strcpy(p -> number, s); …   2.05.2007 1:56
volvo   Эта строка значит следующее: если lst == NULL (или…   2.05.2007 2:20
18192123   А как будет выглядеть удаление 5 нужных элементов?…   2.05.2007 14:17
volvo   А по какому признаку будешь удалять? Нужно... Про…   2.05.2007 15:35
18192123   А по какому признаку будешь удалять? удалять 5 …   2.05.2007 17:25
volvo   Будет гораздо проще сделать наоборот: отсортироват…   2.05.2007 18:43
18192123   вот такие тестовые данные ввожу в исходный файл: q…   9.05.2007 1:33
volvo   Потому что из списка удаляется всего 5 элементов, …   9.05.2007 1:47
18192123   Потому что из списка удаляется всего 5 элементов,…   9.05.2007 1:56
volvo   Так... Кажется мне удалось повторить проблему, кот…   9.05.2007 2:24
18192123   Так... Кажется мне удалось повторить проблему, ко…   9.05.2007 3:37
18192123   всё-таки хочу разобраться и таким вариантом : как,…   9.05.2007 15:02
volvo   С односвязным списком - только через извращение, к…   9.05.2007 15:27
18192123   Я хочу добиться того, чтобы после удаления 5 элеме…   9.05.2007 19:55
18192123   Я хочу добиться того, чтобы после удаления 5 элем…   9.05.2007 23:19
volvo   Потому, что если мы будем передавать просто указат…   9.05.2007 23:56
18192123   объясните пожалуйста некоторые моменты: 1) о сорти…   10.05.2007 2:21
volvo   Давай по порядку: 1) организацию циклов в С знаеш…   10.05.2007 3:23
18192123   volvo, большое спасибо! теперь всё поняла…   10.05.2007 4:06
18192123   Возник ещё вопрос: for(L = *first; L -> next; …   14.05.2007 22:13
18192123   а можно сделать так, чтобы не строки копировать и…   15.05.2007 18:34
volvo   Можно, только код будет больше по размеру... Не за…   15.05.2007 2:52
18192123   Можно, только код будет больше по размеру... Не з…   15.05.2007 3:05
volvo   Ты сама просила :) void sort(LIST **first) { L…   15.05.2007 20:11
18192123   Ты сама просила :) Спасибо! Общую идею поня…   15.05.2007 21:58
18192123   LIST *prv_L, *prv_p; for(pr…   15.05.2007 22:43
volvo   Сорри, я больше в эту тему НЕ отвечаю! Я тебе …   15.05.2007 22:22


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 15.08.2022 10:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name