Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi Console] Список


Автор: Tarantul2007 28.4.2007, 13:51
Дан указатель 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.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)