IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Программа на списки на статистической памяти, не знаю как написать инвертирование
Lint
сообщение 17.03.2008 3:16
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Помогите плс с решением задачи
Такая программа: "Создать еа статистической памяти список строк(словарь). Реализовать функцию, инвертирующую список."

Не знаю как написать функцию инвертирования, точнее написал, но она не работает(((

Вот что получилось:

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 31.07.2025 5:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"