Delphi-Help

Задача 587 на Pascal

Оцените материал
(0 голосов)


Задача 587 на Pascal

Сортировка связанного списка.

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 - первая запись с конца!}

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

Прочитано 5100 раз
Другие материалы в этой категории: « Задача 585 на Pascal

Авторизация



Счетчики