Обработка списков.
Составить программу обработки списка в соответствии с номером задания. Вид списка определяется номером строки табл.2 а вид обработки — номером столбца, в котором стоит номер задания по табл.3.
Вариант 9.
Вид списка: линейный дважды связанный.
Вид обработки: Объединить два списка — второй добавить в хвост, первого. (Циклические списки разрываются в произвольном месте)
По заданию был составлен следующий алгоритм:
1 2 3 4 5 6 7 |
НАЧАЛО Инициализировать 2 списка и ввести начальные значения Вывести списки на экран У последнего элемента первого списка указателю не следующий элемент присвоить значение указателя на первый элемент второго списка. У первого элемента второго списка указателю на предыдущий элемент присвоить значению указателя на последний элемент. Вывести на экран списки КОНЕЦ |
По этому алгоритму была составлена следующая программа на PASCAL-е:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
Program Lab4; Uses Crt; Type PTList=^TList; TList=Record Value:string; Last,Next:PTList; end; Var First1,First2:PTList; Procedure Inp(Var n:Word); var s:string; Err:Integer; z:integer; begin s:='';err:=0; While (s<>'/exit') and (s<>'/stop') do begin Readln(s); val(s,z,Err); If ((err>0) or (s='/exit')) Or (Round(z)<>z) Or (z<0) then Begin Writeln('Ошибка ввода!!! '); Writeln('"/exit"-выход, "/stop"-отмена ввода этого элемента'); Write('Введите число от 0 до 65535: '); end else s:='/stop'; end; if (s='/exit') then halt; n:=z; end; Procedure Print_Free_Mem; begin WriteLn('Доступно ', MemAvail, ' байт.'); end; Procedure Create_List(Var F:PTList); Var P,Last:PTList; Number_Of_Elements,n:word; Begin P:=F; Last:=nil;f:=nil; Writeln('Создание списка.'); Write('Введите количество элементов в списке: '); Inp(Number_Of_Elements); For n:=1 to Number_Of_Elements do begin New(p); P^.Last:=Last; If F=nil then begin F:=p end else Last^.Next:=P; Write('Введите ',n,'-й элемент списка: ');Readln(P^.Value); Last:=p; end; P^.Next:=nil; End; Procedure Print_LIst(F:PTLIST); Var p:PTlist; n:Word; Begin p:=F;n:=1; Writeln('Вывод списка:'); While (p<>nil) do begin Writeln(n:6,'-й элемента списка: ',p^.Value); If n mod 24=0 then Begin writeln('Нажмите любую клавишу для продолжения... ');ReadKey; End; P:=p^.Next; N:=n+1; end; Writeln('Вывод списка закончен. Нажмите любую клавишу...'); Readkey; end; Procedure List_Append(f1,f2:PTList); var p:PTlist; begin P:=f1; Writeln('Соеднение списков...'); While (p^.Next<>nil) do p:=p^.Next; p^.Next:=f2; f2^.Last:=p; Writeln('Соединение списков завершено.'); end; Procedure Create_Lists; begin Create_List(First1); Create_List(First2); end; Procedure Print_Lists; begin Print_LIst(First1); Print_List(First2); end; Procedure Terminate(var F:PTLIst); begin Dispose(F); f:=nil; end; Procedure Delete(var F:PTList); begin Writeln('Удаление списка.'); Repeat If F^.Last<>Nil then Terminate(F^.last); F:=F^.Next; Until (f^.Next=nil); Terminate(F^.last); Terminate(f); Writeln('Удаление списка завершено.'); end; begin Print_Free_Mem; Create_Lists; Print_Lists; List_Append(First1,First2); Print_Lists; Delete(First1); Print_Free_Mem; Writeln('Пpогpамма завеpшила свою pаботу. Нажмите любую клавишу...'); Readkey; end. |
Структура данных:
До обработки:
1 2 3 4 |
┌──┐ First1: ┌──┐First2: └──┘->┌─────┐ ┌─────┐ ┌─────┐ └──┘->┌─────┐ ┌─────┐ ┌─────┐ ├──┬──┤->├──┬──┤->...->├──┬──┤ ├──┬──┤->├──┬──┤->...->├──┬──┤->nil nil <-└──┴──┘<-└──┴──┘<-...<-└──┴──┘ └──┴──┘<-└──┴──┘<-...<-└──┴──┘ |
После обработки:
1 2 3 4 |
┌──┐ First1: ┌──┐First2: └──┘->┌─────┐ ┌─────┐ ┌─────┐ └──┘->┌─────┐ ┌─────┐ ┌─────┐ ├──┬──┤->├──┬──┤->...->├──┬──┤--------->├──┬──┤->├──┬──┤->...->├──┬──┤-> nil nil<- └──┴──┘<-└──┴──┘<-...<-└──┴──┘<---------└──┴──┘<-└──┴──┘<-...<-└──┴──┘ |
Вывод.
Мы написали программу осуществляющую объединение двух списков и научились
работать со списками.