Динамические структуры данных. Задание практикума. Язык Паскаль. Вылиток А.А - 31 стр.

UptoLike

- 31 -
Задача 4. Описать функцию equal(L1,L2), которая проверяет на равенство
списки L1 и L2.
Решение
Если хотя бы один из списков пуст, то в качестве результата функции
можно взять значение выражения L1 = L2. Действительно, если оба списка
пусты (т.е. L1 = nil и L2 = nil), то они равны и выражение L1 = L2 даёт
значение «истина»; если один пуст, другой не пуст (т.е. списки не равны), то
значением выражения будет «ложь». В случае, когда оба списка не пусты,
нужно организовать цикл, в котором два указателя L1 и L2 будут синхронно
«пробегать» по звеньям обоих списков, начиная с первых звеньев. Выход из
цикла происходит, если достигнуто последнее звено хотя бы в одном из
списков (т.е. L1.next = nil или L2.next = nil) или найдены звенья с
различающимися элементами(L1.elem < > L2.elem). Если выход
произошёл из-за неравенства элементов, то результат функции – «ложь». Если
же элементы равны, то результат зависит от того, указывают ли оба указателя
L1 и L2 на последние звенья. Это можно проверить с помощью выражения
L1.next = L2.next, которое принимает значение «истина» если и только
если L1.next = nil и L2.next = nil.
function equal(L1,L2:list): boolean;
{возвращает истину, если списки L1 и L2 равны, иначе
ложь}
begin
if (L1 = nil) or (L2 = nil)
then equal:= L1=L2 {истина, если и только если оба
списка пусты}
else {оба списка непусты; L1 и L2 синхронно пробегают
звенья списков}
begin
while (L1.next<>nil) and (L2.next<>nil)
and (L1.elem=L2.elem)
{пока не достигли последнего звена в каком-либо
из списков
и текущие элементы списков равны,
переходим в каждом из списков к следующему звену}
do begin L1:=L1.next; L2:=L2.next end;
equal:=(L1.next=L2.next) and (L1.elem=L2.elem)
{истина, если и только если L1 и L2 указывают на
последние звенья и элементы в этих звеньях равны}
end
end;
Задача 5. Описать процедуру reverse(L), которая переворачивает
список L,
то есть первый элемент списка становится последним, второйпредпоследним
и т. д., бывший последним становится первым.
Решение
Задача 4. Описать функцию equal(L1,L2), которая проверяет на равенство
списки L1 и L2.
                                 Решение
        Если хотя бы один из списков пуст, то в качестве результата функции
можно взять значение выражения L1 = L2. Действительно, если оба списка
пусты (т.е. L1 = nil и L2 = nil), то они равны и выражение L1 = L2 даёт
значение «истина»; если один пуст, другой не пуст (т.е. списки не равны), то
значением выражения будет «ложь». В случае, когда оба списка не пусты,
нужно организовать цикл, в котором два указателя L1 и L2 будут синхронно
«пробегать» по звеньям обоих списков, начиная с первых звеньев. Выход из
цикла происходит, если достигнуто последнее звено хотя бы в одном из
списков (т.е. L1↑.next = nil или L2↑.next = nil) или найдены звенья с
различающимися      элементами(L1↑.elem < > L2↑.elem).        Если    выход
произошёл из-за неравенства элементов, то результат функции – «ложь». Если
же элементы равны, то результат зависит от того, указывают ли оба указателя
L1 и L2 на последние звенья. Это можно проверить с помощью выражения
L1↑.next = L2↑.next, которое принимает значение «истина» если и только
если L1↑.next = nil и L2↑.next = nil.
function equal(L1,L2:list): boolean;
{возвращает истину, если списки L1 и L2 равны, иначе –
ложь}
begin
  if (L1 = nil) or (L2 = nil)
    then equal:= L1=L2 {истина, если и только если оба
                       списка пусты}
    else {оба списка непусты; L1 и L2 синхронно пробегают
          звенья списков}
      begin
       while (L1↑.next<>nil) and (L2↑.next<>nil)
                         and (L1↑.elem=L2↑.elem)
       {пока не достигли последнего звена в каком-либо
        из списков и текущие элементы списков равны,
        переходим в каждом из списков к следующему звену}
          do begin L1:=L1↑.next; L2:=L2↑.next end;
       equal:=(L1↑.next=L2↑.next) and (L1↑.elem=L2↑.elem)
       {истина, если и только если L1 и L2 указывают на
        последние звенья и элементы в этих звеньях равны}
      end
end;

Задача 5. Описать процедуру reverse(L), которая переворачивает список L,
то есть первый элемент списка становится последним, второй – предпоследним
и т. д., бывший последним становится первым.
                                 Решение



                                   - 31 -