Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 09:16   #1
DjedayD
Новичок
Джуниор
 
Регистрация: 03.05.2011
Сообщений: 1
По умолчанию Динамические переменные и указатели

Здравствуйте! Проблема с работоспособносью программы. Помогите исправить ошибку.

Тема: динамические переменные и указатели
Само задание: Оставить в списке только первое вхождение одинаковых слов

Код:
Код:
Program Spisok;
type
  Tinf=string[35];
  List=^TList;
  TList=record
    data:TInf;
    next:List;
end;
Procedure ClearStek(spis_:List);
var
  tmp:List;
begin
  while spis_<>nil do
  begin
    tmp:=spis_;
    spis_:=spis_^.next;
    FreeMem(tmp,SizeOf(Tlist));
  end;
end;
Function SearchElemZnach(spis_:List;znach1:TInf):List;
begin
  if spis_<>nil then
    while (Spis_<>nil) and (znach1<>spis_^.data) do
      spis_:=spis_^.next;
  SearchElemZnach:=spis_;
end;
Procedure AddElem(var spis_:List;znach_:TInf);
var
  tmp:List;
begin
  if spis_=nil then {Проверяем не пуст ли список, если пуст, то }
  begin
    GetMem(spis_,sizeof(TList));  {создаём его первый элемент}
    tmp:=spis_;
  end
  else {в случае если список не пуст}
  begin
    tmp:=spis_;
    while tmp^.next<>nil do
      tmp:=tmp^.next; {ставим tmp на последний элемент списка}
    GetMem(tmp^.next,sizeof(TList)); {создаём следующий элемент}
    tmp:=tmp^.next;   {переносим tmp на новый элемент}
  end;
  tmp^.next:=nil; {зануляем указатель}
  tmp^.data:=znach_; {заносим значение}
end;
procedure Output(spis_:List);
begin
  if spis_=nil then
  begin
    writeln('Список пуст!');
    exit;
  end;
  while spis_<>nil do
  begin
    Write(spis_^.data, ' ');
    spis_:=spis_^.next
  end;
end;
Procedure DelElem(var stek1:List;tmp:List);
var
  tmpi:List;
begin
  if (stek1=nil) or (tmp=nil) then {если стек пуст или указатель никуда не указывает, то выходим}
    exit;
  if tmp=stek1 then {если мы удаляем элемент который является вершиной стека, то}
  begin
    stek1:=tmp^.next;{следует перенести вершину и}
    FreeMem(tmp,SizeOf(TList)); {высвободить память из под элемента}
  end
  else {в случае, если удаляемый элемент не вершина стека, то}
  begin
    tmpi:=stek1; {ставим указатель на вершину стека}
    while tmpi^.next<>tmp do {доходим до элемента стоящего "перед" тем, который нам следует удалить}
      tmpi:=tmpi^.next;
    tmpi^.next:=tmp^.next; {указатель элемента переносим на следующий элемент за удаляемым}
    FreeMem(tmp,sizeof(TList)); {удаляем элемент}
  end;
end;
var
  MyList,b,c,tp:List;
  n,i,z,h:integer;
  stroka:Tinf;
  f:integer;
  buf:Tinf;
begin
  ClearStek(MyList);
  WriteLn('Сколько элементов добавить в динамический список?');
  ReadLn(n);
for i:=1 to n do
  begin
   readLn(stroka);
   AddElem(MyList,stroka);
   AddElem(b,stroka); {теневой список - пригодится при сравнении}
  end;
WriteLn('Содержимое списка');
Output(MyList);
   while b<>NIL do
   begin
    f:=0;
    buf:=b^.data;
    while MyList<>NIL do
     begin
      if MyList^.data=buf then f:=f+1;
       MyList:=MyList^.next;
      end;
     if f>1 then  {если слов больше одного, то мы ищем его в списке и удаляем, но оставляем 1 вхождение}
      begin
       for n := 1 to (f-1) do
                    begin
                     tp:=SearchElemZnach(MyList,buf);
                               DelElem(MyList,tp);
                   end;
      end;
    b:=b^.next;
   end;
   WriteLn;
   WriteLn('Список после редактирования');
   Output(myList);
   readln;
   ClearStek(MyList);
   ClearStek(b);
end.
Собственно пока тут только код программы без всяких проверок на правильность введенных данных. Но и он не работает...
Буду очень рад, если поможете!
Заранее спасибо!
С уважением, DjedayD!



___________
Код нужно оформлять по правилам:
не словом Код: (это скрипт форума сам напишет),
а тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.05.2011 в 11:16.
DjedayD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе на Си++ Эммануэль Помощь студентам 20 09.04.2011 18:04
Ошибка в программе LuBuMaster Visual C++ 5 07.10.2010 17:19
Ошибка в программе misher Общие вопросы Delphi 12 01.09.2010 19:11
Ошибка в программе larin1974 Помощь студентам 7 06.03.2010 20:44
С++ Ошибка в программе EwwwA Общие вопросы C/C++ 5 05.01.2009 23:12