Страница 1 из 2
Сортировка списка в динамической области(pascal)
Добавлено: 19 фев 2007, 16:55
Nem
Суть в следующем: имеется односвязный список в динамической области. Необходимо отсортировать его по информационному полю. КАк возможно это выполнить на turbo pascal? Создавать второй список нельзя. Подскажите, пожалуйста, или дайте ссылки на подобные задачки. Спасибо.
Re: Сортировка списка в динамической области(pascal)
Добавлено: 19 фев 2007, 20:41
Хыиуду
Во-первых, что значит "в динамической области"? Во-вторых, где он имеется, в языке Турбо Паскаль нет структуры данных "список".
Re: Сортировка списка в динамической области(pascal)
Добавлено: 19 фев 2007, 22:23
Nem
Хыиуду писал(а):Во-первых, что значит "в динамической области"? Во-вторых, где он имеется, в языке Турбо Паскаль нет структуры данных "список".
Вот примерный тип элемента списка:
type uk=^elem;
elem=record
inf:string; {информация конкретного элемента списка}
next:uk; {указатель на следующий элемент}
end;
var beg:uk; {это первый элемент списка}
Далее у меня есть написанные процедуры добавления/удаления элементов.
Так вот мне теперь нужно отсортировать эти элементы по полю inf. А как это сделать даже и не знаю. Ведь доступ ко всем элементам только последовательный.
Re: Сортировка списка в динамической области(pascal)
Добавлено: 19 фев 2007, 22:57
Хыиуду
Дважды в цикле пройтись по массиву: если информационное поле текущего элемента больше, чем у того, на который он указывает, то поменять указатели этих двух элементов местами.
Re: Сортировка списка в динамической области(pascal)
Добавлено: 20 фев 2007, 00:03
Nem
Это понятно. А вот реализовать не могу. Всё время теряются какие-нибудь элементы при переадресации. Если вам не сложно, напишите код этой процедуры. СПасибо.
Re: Сортировка списка в динамической области(pascal)
Добавлено: 20 фев 2007, 23:19
Хыиуду
Процедура, которая меняет два числа а и b - примерно такая:
temp:=a;
a:=b;
b:=temp;
Сортировка пузырьком в отдельной теме
А вот как это все реализовать полностью - не скажу, ибо указатели в Паскале считаю ересью ]:-(
Re: Сортировка списка в динамической области(pascal)
Добавлено: 01 мар 2007, 20:36
KэF
Вообщем нуна составить прогу с динамической памятью(или при помощи денамич памяти), вот задание.
В одномерном массиве, состоящем из N вещественых элементов, вычеслить количество элементов, меньше С.
Вообщем я её решил без денамической памяти

, и как счас приобразовать всё это чтоб было всё в шокаладЕ, т.е чтобы она была с динамической памятью
program dinami4pam9tb;
uses crt;
var
m:array[1..20] of byte;
n,b,i,c:byte;
begin
clrscr;
writeln('Vvedite koli4estvo elementov');
readln(n);
for i:=1 to n do
begin
writeln('Vvedite ',i,' element massiva');
readln(m
);
end;
writeln('Vvedeni massiv');
for i:=1 to n do
begin
writeln('',m,'');
end;
writeln;
b:=0;
write('Vvedite element "C":');
Readln(c);
for i:=1 to n do
if m<c then begin
b:=b+1;
end;
if b=0 then
writeln('Net takih elementov')
else
begin
writeln('Koli4estvo elementov menshe ',c,' ravneitsia ',b);
end;
Readkey;
end.
Re: Сортировка списка в динамической области(pascal)
Добавлено: 01 мар 2007, 21:57
Absurd
Хыиуду писал(а):А вот как это все реализовать полностью - не скажу, ибо указатели в Паскале считаю ересью ]:-(
А как можно к примеру хеш-список реализовать без указателей, если не сектрет?
Re: Сортировка списка в динамической области(pascal)
Добавлено: 02 мар 2007, 10:02
Хыиуду
Absurd писал(а):А как можно к примеру хеш-список реализовать без указателей, если не сектрет?
Будем мыслить, как прикладные программисты: а зачем мне хэш-список?
Re: Сортировка списка в динамической области(pascal)
Добавлено: 02 мар 2007, 12:35
somewhere
Указатели есть основа основ в модели организации памяти. А в паскале работа с указателями сложна и непродумана. Складывать и вычитать их, понимаешь, нельзя - хотя они такие же числа. Умножать на число тоже. И как мне, понимаешь, к сложным структуркам обращаться? 10 типов новых вводить? А если мне число, которое рядом надо - еще один поинтер? На хрен они такие красивые нужны. До сих пор путаю где надо ставить крышку если надо по указателю что-то взять или его объявить. Потому с ними особо не муруюсь и если нужно объявлять структуры, вроде
" писал(а):type uk=^elem;
elem=record
inf:string; {информация конкретного элемента списка}
next:uk; {указатель на следующий элемент}
end;
то делаю его либо в одном сегменте последовательно, либо ищу другие способы орагнизации таких "фрагментированных деревьев". На асме, конечно, проблем никаких нет.
А вообще в такой задаче при сортировке достаточно поменять местами указатели по следующей схеме - пусть надо поменять 2 и 3. Значок ^ означает "указывает"
Первоначально
1 ^ 2 ^ 3 ^ 4
Нужно
1 ^ 3 ^ 2 ^ 4
Следовательно
1. Меняем указатель в 1-ом элементе с 2 на 3
2. Меняем указатель в 2-ом элементе с 3 на 4
3. Меняем указатель в 3-ом элементе с 4 на 2
4. Четвертый указывает на 5-ый, потому ничего не меняем