Линейный список - 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.
Объяснение кода листинга программы
- Объявлены типы данных: TNode и TList.
- Создана процедура ListInit для инициализации списка.
- Создана процедура ListPushBack для добавления элемента в конец списка.
- Создана процедура ListWrite для вывода списка на экран.
- Создана процедура ListFree для освобождения памяти, выделенной под список.
- Создана процедура ListMerge для объединения двух списков в третий.
- В основной части программы созданы три списка: list1, list2, list3.
- В список list1 добавлены элементы от -5 до 5.
- В список list2 добавлены элементы от 1 до 10.
- Выполняется процедура ListMerge, объединяющая list1 и list2 в list3.
- Выводится на экран список list1.
- Выводится на экран список list2.
- Выводится на экран список list3.
- Выполняется процедура ListFree, освобождающая память, выделенную под list1.
- Выполняется процедура ListFree, освобождающая память, выделенную под list2.
- Выполняется процедура ListFree, освобождающая память, выделенную под list3.