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
сообщение 24.05.2009 21:28
Сообщение #2


Гость






Список - это список. Если ты хочешь реализовать его на массиве, он теряет все преимущества. Так что никаких массивов и файлов тебе не надо, просто получай как-то очередное значение (ну, или генерируй рандомно), потом выделяй память под элемент списка и устанавливай указатели. Примеров на списки было очень много, в FAQ-е есть модули для работы со списками. Что именно у тебя вызывает затруднение?
 К началу страницы 
+ Ответить 
reboot
сообщение 24.05.2009 21:38
Сообщение #3


Новичок
*

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

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


прошу прощения, я понял свою ошибку. У меня просто в голове не укладывалось понимание самой структуры списка, и поэтому я думал что ее можно построить на основе массива(дурак). Вобщем я разобрался.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
reboot
сообщение 29.05.2009 12:13
Сообщение #4


Новичок
*

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

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


вобщем проблем не избежал, задача такая: Дан список, состоящий из N вещественных чисел. Удалить из него те звенья, значения которых меньше следующих. Организовать вывод начальной и конечной последовательности значений в списке.
проблема как раз в части кода которая отвечает за поиск и удаление... можите поправить ??

 uses crt;
type ukazatel=^elem_spiska;
elem_spiska=record
znach:integer;
sled:ukazatel;
end;
var number,i,j,r:integer;
temp,root:ukazatel;
begin
clrscr;
randomize;
number:=random(10);
root:=nil;
for i:=1 to number do
begin
temp:=root;
new(root);
with root^ do
begin
znach:=random(50);
sled:=temp;
end;
end;
temp:=root;
for i:=1 to number do begin
writeln('§­ зҐ­ЁҐ = ',temp^.znach);
temp:=temp^.Sled;
end;
temp:=root;

for i:=1 to number do begin
if temp^.znach < temp^.sled^.znach then
begin
temp^.znach:=temp^.sled^.znach;
temp^.sled:=nil;
end;
end;

writeln;
for i:=1 to number do begin
writeln('§­ зҐ­ЁҐ[2] = ',temp^.znach);
temp:=temp^.Sled;
end;
readln;


end.



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.05.2009 12:23
Сообщение #5


Гость






for i:=1 to number do begin
if temp^.znach < temp^.sled^.znach then ...
Вот так делать нежелательно... У тебя список, который заполнять можно циклом For, а обрабатывать потом нужно по-другому: "пока указатель не станет Nil" (запомни указатель на начало списка, иначе его потеряешь)...
 К началу страницы 
+ Ответить 
reboot
сообщение 29.05.2009 16:08
Сообщение #6


Новичок
*

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

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


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

Сообщение отредактировано: reboot - 29.05.2009 17:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.05.2009 18:07
Сообщение #7


Гость






Смотри. Тебе надо идти на один элемент "позади" проверяемой пары, чтобы ты мог контролировать указатель текущего элемента, и (если надо), перебросить его через один элемент:
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
 К началу страницы 
+ Ответить 
reboot
сообщение 29.05.2009 18:57
Сообщение #8


Новичок
*

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

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


спасибо огромное! ты тут описал как раз то что мне было не понятно=) впринципе стало все более яснее, но разбираться еще придется много..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
reboot
сообщение 5.06.2009 19:14
Сообщение #9


Новичок
*

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

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


появился новый вопрос: когда я "корню" присваиваю ссылку на второй элемент то ни чего не происходит...
но первый элемент удаляется же так??

Добавлено через 2 мин.
Цитата(reboot @ 5.06.2009 19:14) *

появился новый вопрос: когда я "корню" присваиваю ссылку на второй элемент то ни чего не происходит...
но первый элемент удаляется же так??

простите..проблема была в паскале...стоило поменять версию как все заработало+)

Сообщение отредактировано: reboot - 5.06.2009 19:15
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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