Линейный список - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста написать саму процедуру к этой задаче: Написать программу, содержащую процедуру, которая объединяет два упорядоченных по неубыванию списка М1 и М2 в один упорядоченный по неубыванию список,построив новый список М.

Решение задачи: «Линейный список»

textual
Листинг программы
program prog;
 
type
  TNode = record
    data: Integer;
    next: ^TNode;
  end;
 
  TList = record
    head: ^TNode;
    tail: ^TNode;
    size: Integer;
  end;
 
 
procedure ListInit(var list: TList);
begin
  list.head:= nil;
  list.tail:= nil;
  list.size:= 0;
end;
 
 
procedure ListPushBack(var list: TList; data: Integer);
begin
  if list.head = nil then begin
    New(list.head);
    list.head^.data:= data;
    list.head^.next:= nil;
    list.tail := list.head;
  end
 
  else begin
    New(list.tail^.next);
    list.tail:= list.tail^.next;
    list.tail^.data:= data;
    list.tail^.next:= nil;
  end;
 
  Inc(list.size);
end;
 
 
procedure ListWrite(const list: TList);
var
  node: ^TNode;
begin
  node:= list.head;
 
  while node <> nil do begin
    Write(node^.data, ' ');
    node:= node^.next;
  end;
 
  WriteLn;
end;
 
 
procedure ListFree(var list: TList);
var
  node: ^TNode;
begin
  while list.head <> nil do begin
    node:= list.head^.next;
    Dispose(list.head);
    list.head:= node;
  end;
end;
 
 
procedure ListMerge(const list1: TList; const list2: TList; var targetList: TList);
var  
  node1, node2: ^TNode;
begin  
  node1:= list1.head;
  node2:= list2.head;
 
  while true do begin
    if node2^.data < node1^.data then begin
      ListPushBack(targetList, node2^.data);
      node2:= node2^.next;
    end  
    else begin
      ListPushBack(targetList, node1^.data);
      node1:= node1^.next;
    end;
      
    if node1 = nil then begin      
      while node2 <> nil do begin
        ListPushBack(targetList, node2^.data);
        node2:= node2^.next;
      end;
      Exit;
    end;
    
    if node2 = nil then begin
      while node1 <> nil do begin
        ListPushBack(targetList, node1^.data);
        node1:= node1^.next;
      end;      
      Exit;
    end;
  end;    
end;
 
 
var
  n: Integer;
  list1, list2, list3: TList;
begin    
  ListInit(list1);
  for n:= -5 to 5 do
    ListPushBack(list1, n);
 
  ListInit(list2);  
  for n:= 1 to 10 do
    ListPushBack(list2, n);
 
  ListInit(list3);
  ListMerge(list1, list2, list3);
    
  ListWrite(list1);
  ListWrite(list2);
  ListWrite(list3);
 
  ListFree(list1);
  ListFree(list2);
  ListFree(list3);
end.

Объяснение кода листинга программы

  1. Объявлены типы данных: TNode и TList.
  2. Создана процедура ListInit для инициализации списка.
  3. Создана процедура ListPushBack для добавления элемента в конец списка.
  4. Создана процедура ListWrite для вывода списка на экран.
  5. Создана процедура ListFree для освобождения памяти, выделенной под список.
  6. Создана процедура ListMerge для объединения двух списков в третий.
  7. В основной части программы созданы три списка: list1, list2, list3.
  8. В список list1 добавлены элементы от -5 до 5.
  9. В список list2 добавлены элементы от 1 до 10.
  10. Выполняется процедура ListMerge, объединяющая list1 и list2 в list3.
  11. Выводится на экран список list1.
  12. Выводится на экран список list2.
  13. Выводится на экран список list3.
  14. Выполняется процедура ListFree, освобождающая память, выделенную под list1.
  15. Выполняется процедура ListFree, освобождающая память, выделенную под list2.
  16. Выполняется процедура ListFree, освобождающая память, выделенную под list3.

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы