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)
volvo
сообщение 17.03.2008 9:31
Сообщение #2


Гость






blink.gif Что, это все нужно только для того, чтобы организовать список в статической памяти???

Мне почему-то казалось, что это делается гораздо проще:

program dict;

const
  n_max = 100;

type
  T = string;

  pitem = ^item;
  item = record
    data: T;
    next: pitem;
  end;

  tlist = record
    data: array[1 .. n_max] of item;
    first, last: pitem;

    free: integer;
  end;


procedure init(var L: tlist);
begin
  L.first := nil; L.last := nil; L.free := 1;
end;

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;

var
  dict1: tlist;
  i, size: integer;
  s: string;

begin
  init(Dict1);
  writeln('Ukazhite razmer slovarya (n <= ', n_max, ')');
  readln(Size);

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

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

 

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