| 
| 
 | Вопрос # 2 085/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Необхдимо написать 3 процедуры по линейным спискам:1) удаление всех элементов с информационным полем, равным данному числу;
 2) удаление всех элементов, стоящих перед элементом с информационным полем, равным даному числу; (например, дан список:
 2  3  4  8  3  1  11  3  4,   и число k=3
 на выходе должно получиться:  3  4  3  1  3  4)
 3) удаление всех кроме одного элементов с одинаковыми информационными полями, стоящих друг за другом;
 (например,   входной список:  2  4  4  4  4  6  7  8  8  1  4  4  8  8  8  12
 на выходе получим:                2  4  6  7  8  1  4  8  12)
 
 Прикрепляю то, что пока что получилось у меня.
 Заранее спасибо!!!
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задала: s_ksuha (статус: Посетитель)Вопрос отправлен: 13 ноября 2008, 20:47
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ В качестве утренней зарядки для мозгов попробовал реализовать всё это.Писал, правда, на Delphi как консольное приложение, но переделать исходник под паскаль, думаю, труда не составит.
 Все три функции удаления, соответствующие пунктам задания, возвращают количество удалённых элементов.
 Изначально списки инициализируются случайными числами.
 Вот результат работы программы, скопированный из консоли:
 
 // Удаление элементов, у которых поле = 0
 ------ Test of function DeleteEqual(): -------
 List: 2 9 0 9 4 1 5 3 9 0
 DeleteEqual(0) = 2
 List: 2 9 9 4 1 5 3 9
 
 // Удаление элементов, стоящих перед элементами, у которых поле = 0
 ------ Test of function DeleteBackwards(): -------
 List: 0 7 7 3 0 4 4 7 7 0
 DeleteBackwards(0) = 2
 List: 0 7 7 0 4 4 7 0
 
 // Удаление всех, кроме одного, повторяющихся элементов
 ------ Test of function DeleteRepeated(): -------
 List: 1 1 2 3 3 0 5 4 3 0
 DeleteRepeated() = 2
 List: 1 2 3 0 5 4 3 0
 
 
 Исходник - в приложении к ответу. Гонял под рандомайзом раз 10, вроде работает. Проверяй.
 Приложение:Переключить в обычный режим program p2085; {$APPTYPE CONSOLE} type  PItem = ^TItem;  TItem = record     end; procedure CreateList(const Count: Integer; var BeginItem: PItem);var  Index: Integer;  Item, ForwardLink: PItem;begin  New(Item);  Item^.BackwardLink:= nil;  BeginItem:= Item;  Index:= 0;   while Index < Count - 1 do    begin           Inc(Index);    end;end; procedure FreeList(const BeginItem: PItem);var  Item, ForwardLink: PItem;begin  Item:= BeginItem;  while Item <> nil do    begin      ForwardLink:= Item^.ForwardLink;      Dispose(Item);      Item:= ForwardLink;    end;end; procedure ListOut(const BeginItem: PItem);var  Item: PItem;begin  Write(' List:');   Item:= BeginItem;  while Item <> nil do    begin      Write(' ', Item^.Value);      Item:= Item^.ForwardLink;    end;   WriteLn;end;  procedure DeleteFromList(var Item: PItem);var begin  if Item = nil    then Exit;    if Item^.ForwardLink <> nil    then Item^.ForwardLink^.BackwardLink:= Item^.BackwardLink;  if Item^.BackwardLink <> nil    then Item^.BackwardLink^.ForwardLink:= Item^.ForwardLink;    end;  function DeleteEqual(var BeginItem: PItem; const Value: Integer): Integer;var  Item: PItem;  Deleted: Integer;begin  Deleted:= 0;  Item:= BeginItem;   while Item <> nil do    if Item^.Value = Value      then begin              if Item = BeginItem               then BeginItem:= Item.ForwardLink;              DeleteFromList(Item);             Inc(Deleted);           end      else Item:= Item^.ForwardLink;   DeleteEqual:= Deleted;end; function DeleteBackwards(var BeginItem: PItem; const Value: Integer): Integer;var  Item, BackwardLink: PItem;  Deleted: Integer;begin  Deleted:= 0;    while Item <> nil do    begin      if Item^.Value = Value        then begin               BackwardLink:= Item^.BackwardLink;                 if BackwardLink = BeginItem                 then BeginItem:= Item;                DeleteFromList(BackwardLink);               Inc(Deleted);             end;       if Item <> nil        then Item:= Item^.ForwardLink;    end;   DeleteBackwards:= Deleted;end; function DeleteRepeated(var BeginItem: PItem): Integer;var  Item, BackwardLink: PItem;  Deleted: Integer;begin  Deleted:= 0;    while Item <> nil do    begin       while Item^.BackwardLink^.Value = Item^.Value do        begin          DeleteFromList(Item);          Inc(Deleted);        end;       if Item <> nil        then Item:= Item^.ForwardLink;    end;   DeleteRepeated:= Deleted;end; var  BeginItem: PItem; const  begin  Randomize();    WriteLn(#13#10'------ Test of function DeleteEqual(): -------');  CreateList(10, BeginItem);  ListOut(BeginItem);  WriteLn('  DeleteEqual(', Value, ') = ', DeleteEqual(BeginItem, Value));  ListOut(BeginItem);  FreeList(BeginItem);     WriteLn(#13#10'------ Test of function DeleteBackwards(): -------');  CreateList(10, BeginItem);  ListOut(BeginItem);  WriteLn('  DeleteBackwards(', Value, ') = ', DeleteBackwards(BeginItem, Value));  ListOut(BeginItem);  FreeList(BeginItem);     WriteLn(#13#10'------ Test of function DeleteRepeated(): -------');  CreateList(10, BeginItem);  ListOut(BeginItem);  WriteLn('  DeleteRepeated() = ', DeleteRepeated(BeginItem));  ListOut(BeginItem);  FreeList(BeginItem);   Write(#13#10'  Press "Enter" for exit...');  ReadLn;end.
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 14 ноября 2008, 10:31
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |