Такая программа: "Создать еа статистической памяти список строк(словарь). Реализовать функцию, инвертирующую список."
Не знаю как написать функцию инвертирования, точнее написал, но она не работает(((
Вот что получилось:
Program dict;
Uses crt;
Const N=100;
Nul=-1;
Type Zapis = String;
Type Element = record(элемент списка, который состоит из записи и ссылки на следующий)
Data: Zapis;
Next: integer;
end;
Type List = record(сам список в виде массива этих элементов)
Data: array [1..N] of Element;
Head: integer;
Free: integer;
end;
Var Dict1:List;
Size:integer;
i:integer;
SElem:zapis;
Num:integer;
a:string;
Last:integer;
Pred:integer;
c:zapis;
Procedure Initial(var Dict1:List);(инициализация списка)
var i: integer;
begin
Dict1.Free:=1;
Dict1.Head:=Nul;
for i:=1 to N-1 do
begin
Dict1.Data[i].Next:=i+1;
Dict1.Data[N].Next:=Nul;
end;
end;
Function CheckPoss(const Dict1:List; const Num:integer):boolean;(проверка наличия свободного элемента)
var Result:boolean;
begin
if ((Dict1.Free<>Nul) or (Num<=N)) then
Result:=true
else
Result:=False;
CheckPoss:=Result;
end;
Function GetFreeElem(var Dict1:List):integer;(получнение номера свободного элемента)
begin
GetFreeElem:=Dict1.Free;
Dict1.Free:=Dict1.Data[Dict1.Free].Next;
end;
Procedure InsertItem(var Dict1:List; const Num:integer;
const FreeElem:integer; const SElem:zapis);(ввод значения нового элемента)
begin
Dict1.Data[FreeElem].Next:=Dict1.Data[Num].Next;
Dict1.Data[Num].Next:=FreeElem;
Dict1.Data[FreeElem].Data:=SElem;
end;
Procedure AddListItem(var Dict1:List; const SElem:Zapis; Num:integer);(само добавление в список)
var FreeItem:integer;
begin
if CheckPoss(Dict1,Num) then
begin
FreeItem:=GetFreeElem(Dict1);
InsertItem(Dict1,Num,FreeItem,SElem);
end;
end;
Procedure AddHeadItem(var Dict1:List; const SElem:Zapis);(добавление в голову списка)
var Num:integer;
begin
Num:=GetFreeElem(Dict1);
if Num<>Nul then
Begin
Dict1.Data[Num].Next:=Dict1.Head;
Dict1.Head:=Num;
Dict1.Data[Num].Data:=SElem;
End;
end;
Procedure Print(const Dict1:List);(печать списка)
var i:integer;
begin
i:=Dict1.Head;
while i<>Nul do
begin
writeln(Dict1.Data[i].Data,' ');
i:=Dict1.Data[i].Next;
end;
end;
Function LastElem(const Dict1:List; var Last:integer):integer;(поиск последнего элемента)
Begin
Last:=Dict1.Head;
while Dict1.Data[Last].Next<>Nul do
Begin
Last:=Dict1.Data[Last].Next;
End;
LastElem:=Last;
End;
Function FindPred(const Dict1:List; var Num:integer):integer;(поиск предыдущего элемента перед элементом с номером num)
var pred:integer;
Begin
If Num<>Dict1.Head then
Begin
pred:=Dict1.Head;
while (pred<>Nul) and (Dict1.Data[pred].Next<>Num) do
pred:=Dict1.Data[pred].Next;
FindPred:=pred;
End
else FindPred:=Nul;
End;
Procedure Invert(var Dict1:List; Num:integer);(инвертирование списка, которое не получается)
var pred:integer;
i:integer;
last:integer;
Begin
writeln('hotite invertirovat spisok?y/n');
readln(a);
if a='y' then
Begin
Num:=LastElem(Dict1,Last);
pred:=FindPred(Dict1,Num);
Dict1.Head:=Nul;
while Num<>Nul do
Begin;
pred:=Dict1.Data[Num].Next;
Num:=Pred;
pred:=FindPred(Dict1,Num);
End;
print(Dict1);
End;
End;
Begin
clrscr;
Initial(Dict1);
writeln('Ukazhite razmer slovarya (n<=',N,')');
readln(Size);
for i:=1 to Size do
begin
writeln('VVedite slovo:');
readln(SElem);
if i=1 then
AddHeadItem(Dict1,SElem)
else
AddHeadItem(Dict1,SElem);
end;
Print(Dict1);
writeln;
Invert(Dict1,Num);
readln;
End.
М | Используй теги |
Сообщение отредактировано: klem4 -