Сортировка списка в динамической области(pascal)

Nem
Сообщения: 4
Зарегистрирован: 18 фев 2007, 23:10

Суть в следующем: имеется односвязный список в динамической области. Необходимо отсортировать его по информационному полю. КАк возможно это выполнить на turbo pascal? Создавать второй список нельзя. Подскажите, пожалуйста, или дайте ссылки на подобные задачки. Спасибо.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Во-первых, что значит "в динамической области"? Во-вторых, где он имеется, в языке Турбо Паскаль нет структуры данных "список".
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Nem
Сообщения: 4
Зарегистрирован: 18 фев 2007, 23:10

Хыиуду писал(а):Во-первых, что значит "в динамической области"? Во-вторых, где он имеется, в языке Турбо Паскаль нет структуры данных "список".
Вот примерный тип элемента списка:
type uk=^elem;
elem=record
inf:string; {информация конкретного элемента списка}
next:uk; {указатель на следующий элемент}
end;
var beg:uk; {это первый элемент списка}
Далее у меня есть написанные процедуры добавления/удаления элементов.
Так вот мне теперь нужно отсортировать эти элементы по полю inf. А как это сделать даже и не знаю. Ведь доступ ко всем элементам только последовательный.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Дважды в цикле пройтись по массиву: если информационное поле текущего элемента больше, чем у того, на который он указывает, то поменять указатели этих двух элементов местами.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Nem
Сообщения: 4
Зарегистрирован: 18 фев 2007, 23:10

Это понятно. А вот реализовать не могу. Всё время теряются какие-нибудь элементы при переадресации. Если вам не сложно, напишите код этой процедуры. СПасибо.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Процедура, которая меняет два числа а и b - примерно такая:
temp:=a;
a:=b;
b:=temp;

Сортировка пузырьком в отдельной теме
А вот как это все реализовать полностью - не скажу, ибо указатели в Паскале считаю ересью ]:-(
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
KэF
Сообщения: 5
Зарегистрирован: 26 фев 2007, 20:44

Вообщем нуна составить прогу с динамической памятью(или при помощи денамич памяти), вот задание.
В одномерном массиве, состоящем из N вещественых элементов, вычеслить количество элементов, меньше С.
Вообщем я её решил без денамической памяти :D , и как счас приобразовать всё это чтоб было всё в шокаладЕ, т.е чтобы она была с динамической памятью
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.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Хыиуду писал(а):А вот как это все реализовать полностью - не скажу, ибо указатели в Паскале считаю ересью ]:-(
А как можно к примеру хеш-список реализовать без указателей, если не сектрет?
2B OR NOT(2B) = FF
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Absurd писал(а):А как можно к примеру хеш-список реализовать без указателей, если не сектрет?
Будем мыслить, как прикладные программисты: а зачем мне хэш-список?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Указатели есть основа основ в модели организации памяти. А в паскале работа с указателями сложна и непродумана. Складывать и вычитать их, понимаешь, нельзя - хотя они такие же числа. Умножать на число тоже. И как мне, понимаешь, к сложным структуркам обращаться? 10 типов новых вводить? А если мне число, которое рядом надо - еще один поинтер? На хрен они такие красивые нужны. До сих пор путаю где надо ставить крышку если надо по указателю что-то взять или его объявить. Потому с ними особо не муруюсь и если нужно объявлять структуры, вроде
&quot писал(а):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-ый, потому ничего не меняем
It's a long way to the top if you wanna rock'n'roll
Ответить