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

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

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

> Стек и очередь, кольцевой список
сообщение
Сообщение #1


Новичок
*

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

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


Задание: Составить программу, которая из кольцевого списка из n элементов удаляет в порядке просмотра кольца каждый k-й элемент до тех пор, пока в списке не останется один элемент. Распечатать номера удаленных элементов.

в некоторых случаях прога глючит т.е., если внести числа с 1 по 9 эл. и end (всего 10 элементов)
внести шаг удаления 3
при проходе в некоторых случаях отображаются "левые" элементы - "J 1 F" , " "

при вводе 4 эл. и end (всего 5 элементов), шаг 3
Error 204: Invalid pointer operation. -> dispose( r ); (стр.4 снизу)

я думаю что не правильно сделал удаление из кольцевого списка, из-за чего и появляются ошибки: Error 204: Invalid pointer operation , или неизвестные элементы

Подскажите плиз

Код
uses Crt, WinDos;

type
 {Указатель на элемент списка}
 PTR=^Sp;
 {Тип данный для записи элемента двусвязного списка}
 Sp=record
   inf: String;{Данные}
   L1: PTR;  {Указатель на следующий элемент списка}
   L2: PTR;  {Указатель на предыдущий элемент списка}
 end;

var
 k: PTR;  {Указатель текущего элемента списка}
 f: PTR;  {Указатель начального элемента списка}
 r: PTR;  {Указатель конечного элемента списка}
 i,j: PTR;
 n: Integer; {Количество}
 ii,kk: Integer;
 Delt: Boolean;

procedure NewSpisok; {Создаем спиок}
begin
 New(k); k^.L1:=nil; k^.L2:=nil;
 write('Введите следущий элемент списка ');Readln(k^.inf);
 f:=k;   r:=k;
 while k^.inf<>'end' do
 begin
   j:=k;  new(k);
   write('Введите следущий элемент списка (или end) ');
   Readln(k^.inf);
   k^.L1:=nil;  k^.L2:=j;
   j^.L1:=k;
   r:=k;
   inc(n);
 end;
 {Замыкаем список}
 r^.L1:=f;
end;

procedure DeleteK;  {удаляем k-ый элемент}
begin
 if ii=kk then
 begin
   writeln('Удаляем элемент ',r^.inf, ' - ',ii,'-ый  элемент');
   j:=r^.L1;  if j<>nil then j^.L2:=r^.L2;
   i:=r^.L2;  if i<>nil then i^.L1:=r^.L1;
   dispose(r);
   if j<>nil then r:=j else r:=i;
   dec(n);
   ii:=0;
   Delt:=true;
 end;
end;

begin
 clrscr;
 writeln('Количество свободной памяти  ',memavail);

 n:=0;   {Количество элементов в списке}
 NewSpisok;   {Создаем список}
 write('k=');readln(kk); {указываем шаг}
 ii:=0;
 writeln('Начинаем обход списка');
 Delt:=false;
 {Пока не остался один элемент}
 while n<>0 do
 begin
   {Если этот и слежующий элемент непустые , переходим к следующему}
   if (r<>nil) and (r^.L1<>nil) and not Delt then
   begin
     r:=r^.L1;
   end;
   Inc(ii);
   writeln('Смотрим элемент ',r^.inf,' - ',ii,'-ый элемент');
   if Delt then Delt:=false;
   DeleteK;  {Если попался k-ый элемент , удаляем и печатаем номер}
 end;
 writeln('Остался элемент ',r^.inf);
 dispose (r);

 writeln('Количество свободной памяти  ',memavail);
 readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 19.05.2024 14:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name