Spicke

spiski

Apr 25th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.49 KB | None | 0 0
  1. type
  2.   {Тип основных данных.}
  3.   TData = Integer;
  4.   {Тип, описывающий указатель на элемент.}
  5.   TPElem = ^TElem;
  6.   {Тип, описывающий элемент списка.}
  7.   TElem = record
  8.     Data : TData;
  9.     PNext : TPElem; {Указатель на следующий элемент.}
  10.   end;
  11.   {Тип, описывающий список.}
  12.   TDList = record
  13.     PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  14.   end;
  15.  
  16. {Процедуры для работы со списком.}
  17.  
  18. {Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
  19. только в отношении пустого списка. Иначе будут утечки памяти.}
  20. procedure Init(var aL : TDList);
  21. begin
  22.   aL.PFirst := nil;
  23.   aL.PLast := nil;
  24. end;
  25.  
  26. {Освобождение памяти, занятой для элементов списка и инициализация.}
  27. procedure LFree(var aL : TDList);
  28. var
  29.   P, PDel : TPElem;
  30. begin
  31.   P := aL.PFirst; {Указатель на первый элемент списка.}
  32.   while P <> nil do
  33.   begin
  34.     PDel := P; {Запоминаем указатель на текущий элемент.}
  35.     P := P^.PNext; {Получаем указатель на следующий элемент.}
  36.     Dispose(PDel); {Освобождаем память, занятую текущим элементом списка.}
  37.   end;
  38.   Init(aL);
  39. end;
  40.  
  41. {Добавление элемента в список согласно сортировочному правилу - по невозрастанию,
  42. в данном случае.}
  43. procedure AddDesc(var aL : TDList; const aData : TData);
  44. var
  45.   PNew, PCur, PPrev : TPElem;
  46. begin
  47.   New(PNew); {Выделяем паямять для элемента.}
  48.   PNew^.Data := aData; {Записываем данные.}
  49.   {Ищем элемент, который меньше или равен новому - перед ним следует вставить
  50.   новый элемент.}
  51.   PCur := aL.PFirst;{Указатель на текущий элемент.}
  52.   {Указатель на предыдущий элемент. Этот указатель мы должны знать для того,
  53.   чтобы мы могли вставить новый элемент между PPrev и PCur.}
  54.   PPrev := nil;
  55.   while (PCur <> nil) and (PCur^.Data > aData) do
  56.   begin
  57.     PPrev := PCur;
  58.     PCur := PCur^.PNext;
  59.   end;
  60.   {Теперь, в зависимости от результатов поиска выполняем вставку нового элемента
  61.   в нужное место списка.}
  62.   PNew^.PNext := PCur;
  63.   if PPrev <> nil then {Добавление между PPrev и PCur, либо - в конец списка.}
  64.     PPrev^.PNext := PNew
  65.   else {Добавление в начало списка.}
  66.     aL.PFirst := PNew;
  67.   if PNew^.PNext = nil then {Если новый элемент стал последним элементом в списке.}
  68.     aL.PLast := PNew;
  69. end;
  70.  
  71. {Распечатка списка.}
  72. procedure LWriteln(const aL : TDList);
  73. var
  74.   P : TPElem;
  75. begin
  76.   P := aL.PFirst; {Указатель на первый элемент списка.}
  77.   if P <> nil then
  78.   repeat
  79.     {Если это не первый элемент, то в распечатке ставим перед ним запятую.}
  80.     if P <> aL.PFirst then
  81.       Write(', ');
  82.     Write(P^.Data); {Распечатываем данные текущего элемента.}
  83.     P := P^.PNext; {Получаем указатель на следующий элемент.}
  84.   until P = nil
  85.   else
  86.     Write('Список пуст.');
  87.   Writeln;
  88. end;
  89.  
  90. const
  91.   M = 5; {Количество элементов, которые мы будем добавлять в списки.}
  92. var
  93.   L1, L2, L3 : TDList;
  94.   P : TPElem;
  95.   i : Integer;
  96.   S : String;
  97. begin
  98.   {Начальная инициализация списков.}
  99.   Init(L1);
  100.   Init(L2);
  101.   Init(L3);
  102.  
  103.   repeat
  104.     {Создаём исходные списки.}
  105.     Randomize; {Инициализируем генератор случайных чисел.}
  106.     for i := 1 to M do
  107.     begin
  108.       AddDesc(L1, Random(100)); {Случайные целые числа из диапазона: 0..99.}
  109.       AddDesc(L2, Random(100));
  110.     end;
  111.     Writeln('Заданы списки: ');
  112.     LWriteln(L1);
  113.     LWriteln(L2);
  114.  
  115.     {Выполняем слияние исходных списков в результирующий.}
  116.     {Слияние первого списка.}
  117.     P := L1.PFirst;
  118.     while P <> nil do
  119.     begin
  120.       AddDesc(L3, P^.Data);
  121.       P := P^.PNext;
  122.     end;
  123.     {Слияние второго списка.}
  124.     P := L2.PFirst;
  125.     while P <> nil do
  126.     begin
  127.       AddDesc(L3, P^.Data);
  128.       P := P^.PNext;
  129.     end;
  130.  
  131.     {Ответ.}
  132.     Writeln('Результат слияния:');
  133.     LWriteln(L3);
  134.  
  135.     {Освобождение памяти, занятой для элементов списков.}
  136.     LFree(L1);
  137.     LFree(L2);
  138.     LFree(L3);
  139.     Writeln('Память, выделенная для списков - освобождена.');
  140.  
  141.     Writeln('Повторить - Enter, выход - любой символ + Enter.');
  142.     Readln(S);
  143.   until S <> '';
  144. end.
Advertisement
Add Comment
Please, Sign In to add comment