Решенные задачи на языке Паскаль
Сортировка связанного списка.
TYPE
Link=^data; {указатель на тип данных }
data=record {описание самого типа данных }
FIO:string[50]; {ФИО }
N:integer; {номер }
next:Link; {указатель (адрес) на следующую запись}
end;
VAR
P,First:Link; {указатели на запись: текущую, первую }
m:byte; {для меню }
{процедура - добавление новой записи в список}
PROCEDURE AddData;
BEGIN
P:=new(Link); { выделить память и адрес записать в P}
P^.next:=First; { адрес на следующую запись }
First:=P; { сохраняем адрес первой записи }
{здесь заполняйте запись данными в соответствии с вашим типом }
write('Введите ФИО: ');
readln(P^.FIO);
write('Введите номер: ');
readln(P^.N);
END;
{вывод на экран}
PROCEDURE Print;
var
count:integer; {счетчик для нумерации }
BEGIN
count:=0;
P:=First; {начать с первой записи }
while P<>nil do
begin
inc(count); {увеличить счетчик }
writeln(count,') ',P^.FIO,' ',P^.N);
P:=P^.next; {перейти к очередной записи }
end;
readln;
END;
{процедура - удаление всего списка, освобождение динамической памяти}
PROCEDURE DelData;
BEGIN
P:=First;
while P<>nil do
begin
First:=P^.next; {сохранить адрес указывающий на следующую запись}
dispose(P); {освободить память по текущему адресу }
P:=First; {сохраненный адрес записать в P }
end;
END;
{процедура - сортировки списка по возрастанию}
PROCEDURE Sort;
var
P1,P2,TMP:Link; {P1,P2 - адрес записи для циклов, TMP - временно}
BEGIN
new(TMP); {выделим память для TMP }
P1:=First; {начать цикл 1 с первой записи }
while P1<>nil do {выполняем пока не дошли до конца цикла 1}
begin
P2:=First; {начать цикл 2 с первой записи }
while P2<>nil do {выполняем пока не дошли до конца цикла 2}
begin
if P1^.N<P2^.N then
begin
{сохраняем данные в временную переменную}
{адрес на следующую запись не изменяем! }
TMP^.FIO:=P1^.FIO;
TMP^.N:=P1^.N;
{делаем обмен данными по адресу P1 }
P1^.FIO:=P2^.FIO;
P1^.N:=P2^.N;
{делаем обмен данными по адресу P2 }
P2^.FIO:=TMP^.FIO;
P2^.N:=TMP^.N;
end;
P2:=P2^.next; {переходим к следующей записи цикла 2}
end;
P1:=P1^.next; {переходим к следующей записи цикла 1}
end;
dispose(TMP); {освобождаем память, занимаемую TMP }
END;
{==== основная программа ====}
BEGIN
First:=nil; {нет записей в списке, адрес пустой }
repeat { меню }
AddData;
writeln('1 - добавить новую запись');
writeln('2 - выйти и далее...');
write('=>');
readln(m);
until m=2; {end меню}
writeln('== До сортировки ==');
Print;
Sort;
writeln('== После сортировки ==');
Print;
DelData;
END.
{Примечание: First - первая запись с конца!}
Данный пример показывает: как вводить данные в список с помощью меню, как вывести список на экран, как отсортировать список, как освободить пямять занимаемую списком.Скачать исходник