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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2018, 22:59   #1
kami_sa
Новичок
Джуниор
 
Регистрация: 12.01.2018
Сообщений: 4
По умолчанию Ошибка в программе PascalABC.NET. Работа с односвязным списком, указателями. "Посчитать всё элементы, у которых одинаковые соседи, добавить их количество в конец списка"

Не работает процедура res_, которая должна считать количество элементов, у которых соседи слева и справа одинаковы.
{Имеется список, элементами которого являются целые числа. Посчитать всё элементы, у которых одинаковые соседи, добавить их количество в конец списка}
Код:
type
   PNode = ^TNode;
   TNode = record
    data : integer;
    next  : PNode;
   END;
   var 
      first, q, p:PNode;
   function NewNode(d: integer; n: PNode):PNode; {Создание списка вещественных чисел}
begin
  New(Result);
  Result^.data :=d;
  Result^.next :=n;
end;
procedure write_(p:PNode); {Вывод списка}
begin
  writeln('Содержимое односвязанного списка:' );
    while p<>nil do
  begin
    write(p^.data, ' ');
    p := p^.next;
   end;
  writeln
end;
procedure Dispose_(p:PNode); {Очищение стека}
  begin
  while p<>nil do
    begin
      var p1:=p;
      p:=p^.next;
      Dispose(p1);
    end;
end;

procedure res_ ( var p: PNode);
var
  m: PNode;
  count: byte;
  a, b: integer;
begin
  count:=0;
  m:=p;
  while m<>nil do 
  begin
     m:=p^.next;
     m:=m^.next;
     writeln ('Значение в М: ',m^.data,', значение в Р: ',p^.data);  :(:(:(
     if (p^.data=m^.data) then inc (count);
     p:=p^.next;
     if (m^.next=nil) then break;
  end;
writeln ('Количество элементов с равными соседями: ',count);
dispose_(m);
end;

begin
 First:=nil;
 for var i:=1 to random(15) do
   first :=NewNode(random(10), first);
 p :=first;
 write_(p);
 p:=first;
 res_(p);
 dispose_ (p);
end.
Судя по всему, ошибка появляется где-то в строчке, отмеченной смайликами, и то в конце цикла т.к. считает и определяет пары правильно (прогоняла программу построчно). Думаю, что ошибка в p^.data и m^.data, но не могу понять, почему (ошибка там, потому что если убрать эту строку, то то же самое, но строка ошибки перескакивает на следующее такое значение).

Заранее спасибо!

Последний раз редактировалось Аватар; 12.01.2018 в 23:06.
kami_sa вне форума Ответить с цитированием
Старый 13.01.2018, 12:27   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
  m:=p;
  while m<>nil do // здесь проверяем конец списка по одной переменной
  begin
     m:=p^.next; // а движение в списке организуем совсем по другой переменой
     ...
     p:=p^.next; // да и здесь
Код:
m:=p;
while m<>nil do
begin
  v1:=m; //запомнили
  m:=m.next; // сдвинулись
  if m=nil then break else  v2:=m.next; //узнали следующее
  if v2=nil then break; //если его нет
  if v1.data =v2.data then .... // делаем подсчет
end;
Код:
while (m<>nil) // до конца
              and (m.next<>nil) // не совсем до конца 
                               and (m.next.next<>nil) // и еще раньше 
                                                     do 
begin
  v1:=m;
  m:=m.next;
  v2:=m.next;
  if v1.data=v2.data then ...
P.S. ^ расставь самостоятельно. код не проверялся.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.01.2018 в 12:44.
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PascalABC.net (эмуляция стрелочки в игре "Твистер") IvanNikulin Помощь студентам 0 29.12.2016 16:17
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Машина Тьюринга: Определите, имеются ли в слове Х две одинаковые буквы, идущие подряд, если слово состоит из букв "C" и "D" Елешечка Помощь студентам 8 06.04.2014 17:19
Вводится последовательность символов, конец ввода -ESC(код#27). Определить количество букв "b". помогите сделать через string. kolbaskin Паскаль, Turbo Pascal, PascalABC.NET 2 30.12.2013 09:12
Вводится текст. Конец ввода <F2>. Найти количество букв "е" лина 555 Паскаль, Turbo Pascal, PascalABC.NET 6 16.10.2013 20:21