Страница 1 из 1
Динамический список. Поиск и удаление элементов.
Добавлено: 29 апр 2009, 19:39
Paulo
никак не могу решить задачу на Паскале
Динамические структуры данных. Линейные списки: основные виды и способы реализации.
Сформировать список слов. Написать функцию, которая удаляет из списка все односложные слова.
Re: Динамический список. Поиск и удаление элементов.
Добавлено: 30 апр 2009, 11:15
Naeel Maqsudov
Код: Выделить всё
type
TItemData = string;
CBListCallbackFunction = function(W:TItemData):boolean;
PItem = ^TItem;
TItem = record
Data : TItemData;
Next : PItem;
end;
function IsShortWord(W:TItemData):boolean; far;
const
vowels:set of char = ['а','е','ё','и','о','у','ы','э','ю','я',
'А','Е','Ё','И','О','У','Ы','Э','Ю','Я'];
var
n,i:integer;
begin
i:=1; n:=0;
while (n<=1) and (i<=length(W)) do begin
if W[i] in vowels then inc(n);
inc(i);
end;
IsShortWord:= n=1;
end;
function WriteItem(W:TItemData):boolean; far;
begin
write(W,' '); WriteItem:=true;
end;
procedure InsertAtHead(X:TItemData;var List:PItem);
var
Item:PItem;
begin
New(Item);
Item^.Data:=X;
Item^.Next:=List;
List:=Item;
end;
function DeleteUsingCallback(var List:PItem; CBFunc:CBListCallbackFunction):boolean;
var
Item,CurItem:PItem;
R:boolean;
begin
R:=false;
while (List<>nil) and CBFunc(List^.Data) do begin
Item:=List;
List:=List^.Next;
Dispose(Item);
R:=true;
end;
CurItem:=List;
if CurItem<>nil then while (CurItem^.Next<>nil) do begin
if CBFunc(CurItem^.Next^.Data) then begin
Item:=CurItem^.Next;
CurItem^.Next:=CurItem^.Next^.Next;
Dispose(Item);
R:=true;
end else begin
CurItem:=CurItem^.Next;
end;
end;
DeleteUsingCallback:=R;
end;
procedure ForEach(List:PItem; CBFunc:CBListCallbackFunction);
begin
while List<>nil do begin
CBFunc(List^.Data);
List:=List^.Next;
end;
end;
var
s:string;
Lst:PItem;
begin
Lst:=nil;
writeln('Вводите слова. В конце последнего слова поставьте точку');
repeat
readln(S);
InsertAtHead(S,Lst);
until S[length(S)]='.';
writeln('Исходный список:');
ForEach(Lst,WriteItem);
writeln;
if DeleteUsingCallback(Lst,IsShortWord) then begin
writeln('Односложные слова удалены');
ForEach(Lst,WriteItem);
writeln;
end else begin
writeln('Односложных слов не найдено');
end;
end.
Протокол работы программы:
Вводите слова. В конце последнего поставьте точку
Я
встретил
Вас
и
все
былое...
Исходный список:
былое... все и Вас встретил Я
Односложные слова удалены
былое... встретил
Re: Динамический список. Поиск и удаление элементов.
Добавлено: 01 май 2009, 12:22
Paulo
спасибо большое!!!!!!))))