|
Вопрос # 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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|