Помощь - Поиск - Пользователи - Календарь
Полная версия: однонаправленный линейный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Тёмный Эльф

uses crt;
Type
next=^elem;
Elem=RECORD
     EL:string;
     Sled:next;
     END;
VAR
Uk1:next;
Qp,N,K,Int:Integer;

Procedure VVOD(var p:next); {формирование однонаправленного линейного списка, подсчет количества строк в исходном файле, чтение списка в файл RES.OUT}
var
m:next;
F1:text;
BEGIN
  Assign(F1,'DAN.inp');
  Reset(f1);
  Assign(output,'res.out');
  rewrite(output);
 Writeln('Дано: ');
 New(m);
 New(m^.sled);
 p:=m;
 Readln(f1, m^.el);
 m^.sled:=nil;
 Int:=1;
 while not EOF(f1) do
 begin
 New(m^.sled);
 m:=m^.sled;
 Int:=Int+1;
 Readln(f1, m^.el);
 m^.sled:=nil;
 End;
 Close(f1);
 m:=p;
 While m<>NIL do
 Begin
 Writeln(m^.el);
 m:=m^.sled;
 End;
end;

procedure Cleaning(var uk:next); {процедура удаления из списка с N-ой по K-ую строки}
var pp,q,r:next;
D:integer;
Begin
writeln('ВСЕГО СТРОК в исходном файле: ',Int);
 If (N>Int) or (K>Int) then 
Begin
 Writeln ('Запрашиваемых Вами строк нет, исходные данные не изменились');
 exit; {выход из процедуры в случае ошибки пользователя}
end;
D:=1;
While (D>=N) and (D<=K) do BEGIN
If D=K then Begin    {удаляем конечную строку}
	     pp:=uk;
	     q:=uk;
	     while pp^.sled<>NIL do
	     Begin
	     q:=pp;
	     pp:=pp^.sled;
	     End;
	     q^.Sled:=NiL;
	     Dispose(pp);
	     end;

If D=N then Begin {удаляем начальную строку}

	     pp:=uk;
	     uk:=uk^.sled;
	     Dispose(pp);
	    end;
      D:=D+1;
      pp:=pp^.sled; {указатель смещается на одну позицию, счетчик увеличивается}

   While (D>=N) and (D<=K)  do 
     Begin
      q:=pp;
      pp:=q^.sled;
      dispose(q); {компилятор выдаёт ERROR 204}
      pp:=pp^.sled;
      D:=D+1;
     end;

end;
END;

procedure vivod(var dr:next); {вывод отредактированного списка в файл RES.OUT}
var dt:next;
Begin
writeln('=======REZULTAT=======');
dt:=dr;
 While dt<>NIL do
 Begin
 Writeln(dt^.el);
 dt:=dt^.sled;
 End;
 close(output);
end;

BEGIN
clrscr;
Writeln('Введите номер начальной и конечной строки');
readln(N,K);
VVOD(Uk1);
Cleaning(Uk1);
vivod(Uk1);
END.
 
Bokul
Заключи код в теги, тогда посмотрим...
Bokul
И что ты считаешь, что при появлении горизонтальной прокрутки читабельность кода увеличивается? blink.gif
Тёмный Эльф
Цитата(Bokul @ 17.12.2006 2:43) *

Заключи код в теги, тогда посмотрим...

smile.gif ща исправим!
Bokul
Во-первых следующий раз не отформатированный код я читать не буду. Если хочешь помощью, то уважай людей, от которых ты хочешь ее получить.

Во-вторых приведи полный исходник.

Вот, что я имею ввиду под словом "форматирования":

uses crt;
Type
    next=^elem;
    Elem=RECORD
      EL:string;
      Sled:next;
    END;

VAR Uk1:next;
procedure Cleaning(var uk:next);
var pp,q:next;
    D:integer;
Begin
  D:=1;
  While (D>=N) and (D<=K) do
        BEGIN
          If D=K then
             Begin
               pp:=uk;
               q:=uk;
               while pp^.sled<>NIL do
                     Begin
                       q:=pp;
                       pp:=pp^.sled;
                     End;
               q^.Sled:=NiL;
               Dispose(pp);
             end;
           If D=N then
              Begin
                pp:=uk;
                uk:=uk^.sled;
                Dispose(pp);
              end;
           D:=D+1;
           pp:=pp^.sled;
           While (D>=N) and (D<=K)  do
                 Begin
                   q:=pp;
                   pp:=q^.sled;
                   dispose(q);
                   pp:=pp^.sled;
                   D:=D+1;
                 end;
       end; 
END


Michael_Rybak
Цитата(Тёмный Эльф @ 17.12.2006 1:56) *

smile.gif ща исправим!


Честное слово, читать нереально с такой табуляцией smile.gif

Цитата
Если хочешь помощью, то уважай людей, от которых ты хочешь ее получить.

yes2.gif


2 Тёмный Эльф

Если надо удалить с N по K, то просто идем до N-1-го, и потом удаляем K-N+1 штук. Для удобства (чтобы не учитывать отдельно случай N=1) вставляем в начало списка дополнительный элемент. Типа такого:


...
var add, cur, t: next;
begin
  New(add);
  add^.sled := uk;
  cur := add;
  for i := 1 to n - 1 do
    cur := cur^.sled;
  for i := 1 to k - n + 1 do begin
    t := cur^.sled^.sled;
    Dispose(cur^.sled);
    cur^.sled := t;    
  end;
  uk := add^.sled;
  Dispose(add);
end;
Тёмный Эльф
Если надо удалить с N по K, то просто идем до N-1-го, и потом удаляем K-N+1 штук. 


Michael_Rybak !Спасибо! Так на самом деле удобнее. А я то мучался..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.