Решенные задачи на языке Паскаль
Сортировка связанного списка.
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 - первая запись с конца!}Данный пример показывает: как вводить данные в список с помощью меню, как вывести список на экран, как отсортировать список, как освободить пямять занимаемую списком.
Скачать исходник