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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> списки-динамическая структура
reboot
сообщение 24.05.2009 21:18
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской

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


помогите с такой задачей:
Дан список, состоящий из N вещественных чисел. Удалить из него те звенья, значения которых меньше следующих. Организовать вывод начальной и конечной последовательности значений в списке.
вопрос первый: сдесь нужен массив записей, или можно обойтись нетипизированным файлом?
вопрос второй: если использовать массив то как обращаться к элементу списка при его заполнении рандомными числами?
понимаю что вопросы глупые и легкие(для кого-то), но у меня просто не очень хорошо общение со списками идет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 29.05.2009 18:07
Сообщение #2


Гость






Смотри. Тебе надо идти на один элемент "позади" проверяемой пары, чтобы ты мог контролировать указатель текущего элемента, и (если надо), перебросить его через один элемент:
temp := root;
while (temp^.sled <> nil) and (temp^.sled^.sled <> nil) do begin
{ проверяем пару: следующий и который за ним, текущий не трогаем... }
if temp^.sled^.znach < temp^.sled^.Sled^.znach then begin
t2 := temp^.sled; { <--- Запоминаем элемент, нам его надо будет удалить }
temp^.sled := t2^.sled; { корректируем указатели (перепрыгиваем через temp^.sled) }
dispose(t2); { Теперь можно удалять меньший элемент }
end
else temp := temp^.sled; { если ничего из списка не удалялось - продвигаемся дальше }
end;
Но... При таком проходе по списку одна пара от тебя ускользнет: это самый первый и второй элементы, они не будут сравниваться, сравнение начнется с пары "второй - третий". Это нехорошо. Чтоб решить проблему - введи еще одну переменную, типа Boolean, и перед проходом, который я показал, присвой ей True если root^.znach < root^.sled^.znach... Иначе - False.

Что это тебе даст? Потом, после прохода, и удаления меньших элементов в паре, тебе надо напечатать список? Вот если переменная равна True, удалишь из списка первый элемент, а потом начнешь печатать. Если False - ничего делать не надо, первый элемент не меньше второго, и его удалять не надо.

Теперь о печати списка. Опять же, не делается это через цикл For, вот так надо:
temp := root;
while temp <> nil do begin
writeln('список[2] = ', temp^.znach);
temp:=temp^.Sled;
end;


Попробуй реализовать... Это не сложно, просто надо понять алгоритм. Начерти список со связями на бумаге, и разберись, что делается в том алгоритме, который я привел, что чему присваивается... Когда разберешься - будешь щелкать такие задачи как семечки smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



- Текстовая версия 20.07.2025 2:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"