Дан указатель P0 на один из элементов непустого двусвязного списка. Удалить из списка данный элемент и вывести два указателя: на элемент, предшествующий удаленному, и на элемент, следующий за удаленным (один или оба этих элемента могут отсутствовать; для отсутствующих элементов выводить nil). После удаления элемента из списка освободить память, занимаемую этим элементом. Записать все значения списка в файл с именем "double_linked_list_2.txt"
Код | program Variant2; {$APPTYPE CONSOLE}
uses SysUtils, windows;
type TPList=^TList; TList=record data:integer; next,prev:TPlist end; var head,p0:TPList; i,el:integer; ch:char;
procedure AddToBegin(var head:TPList; elem:integer); var current:TPList; begin New(current); current^.data:=elem; current^.next:=head; current^.prev:=nil; head^.prev:=current; head:=current;
end;
procedure AddToEnd(var head:TPList; elem:integer); var last,tmp:TPList; begin New(last); last^.data:=elem; last^.next:=nil; if head=nil then begin head:=last; last^.prev:=nil; end else begin tmp:=head; while tmp^.next<>nil do tmp:=tmp^.next; tmp^.next:=last; last^.prev:=tmp; end; end;
procedure PrintList; var tmp:TPList; begin tmp:=head; while tmp<>nil do begin write(tmp^.data,'-->'); tmp:=tmp^.next; end; writeln('nil'); end;
procedure DelEl(var head,p0:TPList); var after:TPList; begin if head=nil then begin Writeln('Ошибка!'); end; if p0=head then begin head:=p0^.next; head^.prev:=nil; end else begin after:=p0^.next; head^.next:=after; after^.prev:=head; end; Dispose(p0); end;
procedure ZapisVFile; var f:text; tmp:TPList; begin assign(f,'c:\double linked 2.txt'); rewrite(f); tmp:=head; while tmp<>nil do begin write(f,tmp^.data,'-->'); tmp:=tmp^.next; end; write(f,'nil'); close(f); end;
procedure FreeList; var current:TPList; begin while head^.next<>nil do begin current:=head^.next; Dispose(head); head:=current; end; Dispose(head); head:=nil; end;
begin SetconsoleCP(1251); SetconsoleoutputCP(1251); head:=nil; p0:=nil; for i:=1 to 5 do begin writeln('Введите элемент'); readln(el); writeln('Добавить элемент в начало или в конец (n/k)?'); readln(ch); if ch='n' then AddToBegin(head,el) else if ch='k' then AddToEnd(head,el); end; writeln('-----------------'); writeln('Полученный список'); writeln('-----------------'); PrintList; DelEl(head,p0); PrintList; ZapisVFile; writeln; writeln('Адрес вершины p0 = ',integer(addr((p0)))); FreeList; PrintList; readln; end.
|
|