1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Программа на списки на статистической памяти, не знаю как написать инвертирование
Помогите плс с решением задачи Такая программа: "Создать еа статистической памяти список строк(словарь). Реализовать функцию, инвертирующую список."
Не знаю как написать функцию инвертирования, точнее написал, но она не работает(((
Вот что получилось:
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 - 17.03.2008 8:49
procedure append(var L: tlist; value: T); var p: pitem; begin p := @(L.data[L.free]); inc(L.free); p^.data := value; p^.next := nil;
if L.first = nil then L.first := p else L.last^.next := p;
L.last := p end;
procedure invert(var L: tlist); var p, T: pitem; begin if (L.first = nil) or (not assigned(L.first^.next)) then exit else begin p := nil; L.last := L.first; while assigned(L.first) do begin T := L.first^.next; L.first^.next := p; p := L.first; L.first := T end; L.first := p end end;
procedure print(var L: tlist); var p: pitem; begin p := L.first; while assigned(p) do begin writeln(p^.data); p := p^.next end; end;
for i :=1 to Size do begin writeln('VVedite slovo:'); readln(s); append(dict1, s); { Добавляем элемент сразу в конец списка, и не надо никакого инверта... } end;
print(Dict1); writeln; invert(Dict1); { но раз уж хочется - то вот тебе еще и инверт... } print(Dict1); readln; end.
Проверок на переполнение списка не делал, для того, чтобы их добавить, придется слегка модифицировать процедуру Append...