Кольцевой список, программа входит в бесконечный цикл - Free Pascal
Формулировка задачи:
здравствуйте, помогите пожалуйста с задачей. Я ее написал, но у меня всегда идет бесконечный цикл, не могу найти ошибку.
дан однонопрвленный кольцевой список целых чисел. вставить перед каждым элементом, являющемся простым числом, элемент равный количеству цифр этого простого числа.
type circle=^elem; {однонаправленное кольцо }
elem=record
info:integer;
next:circle;
end;
var p,q,l:circle; k:integer;
procedure create(var l:circle);
var x:integer;
begin
readln(x);
if x<>0 then begin
new(l);
l^.info:=x;
p:=l;
p^.next:=nil;
readln(x); end;
while x<>0 do begin
new(q);
q^.info:=x;
p^.next:=q;
p:=q;
q^.next:=l;
readln(x); end; end;
FUNCTION pr(p:circle):boolean;
var i,k:integer; l:circle; f:boolean;
begin
k:=0;
for i:=2 to p^.info div 2 do
if p^.info mod i =0 then k:=k+1;
if k=0 then writeln ('pr') else writeln('not pr');
end;
procedure kol(k:integer);
var p:circle;
begin
while p^.info<>0 do begin
if p^.info div 10 <>0 then k:=k+1; p^.info:=p^.info div 10;
end; end;
Begin
create(l);
repeat
while p<>nil do begin
if pr(p)=true then begin
kol(k);
new(q);
q^.info:=k;
q^.next:=p^.next;
p^.next:=q; end; end;
until p=l;
readln; end.Решение задачи: «Кольцевой список, программа входит в бесконечный цикл»
textual
Листинг программы
program test;
type
circle = ^elem; {однонаправленное кольцо }
elem = record
info: integer;
Next: circle;
end;
procedure ListAdd(var Root: circle; info: integer);
var
p: circle;
begin
new(p);
if Root = nil then
begin
Root := p;
p^.Info := info;
p^.Next := p;
end
else
begin
p^.Info := Root^.Info;
p^.Next := Root^.Next;
Root^.Info := info;
Root^.Next := p;
Root := p;
end;
end;
procedure ListFree(var ARoot: circle);
var
Temp, p: circle;
begin
if ARoot <> nil then
begin
p := ARoot;
repeat
Temp := p;
p := p^.Next;
dispose(Temp);
until p = ARoot;
end;
ARoot := nil;
end;
procedure Create(var l: circle);
var
x: integer;
begin
for x := 97 to 120 do
ListAdd(l, x);
end;
function pr(p: integer): boolean;
var
i: integer;
Res: boolean;
begin
Res := (p > 1);
if p > 3 then
begin
i := 2;
while p div i >= i do
begin
Res := Res and (p mod i <> 0);
i := i + 1;
end;
end;
pr := Res;
end;
function kol(k: integer): integer;
var
Count: integer;
begin
Count := 0;
repeat
k := k div 10;
Count := Count + 1;
until k = 0;
kol := Count;
end;
procedure Show(Root: circle);
var
p: circle;
begin
p := Root;
Write('< ');
if Root <> nil then
begin
repeat
Write(p^.Info: 4);
p := p^.Next;
until p = Root;
end;
writeln('>');
end;
var
p, l: circle;
begin
Create(l);
Show(l);
p := l;
if p <> nil then
begin
repeat
if pr(p^.info) then
ListAdd(p, kol(p^.Info));
p := p^.Next;
until p = l;
end;
Show(l);
ListFree(l);
end.
Объяснение кода листинга программы
- Объявлены типы данных:
- circle = ^elem; (однонаправленное кольцо)
- elem = record info: integer; Next: circle; end;
- Объявлены процедуры:
- ListAdd(var Root: circle; info: integer);
- ListFree(var ARoot: circle);
- Create(var l: circle);
- pr(p: integer): boolean;
- kol(k: integer): integer;
- Show(Root: circle);
- В процедуре Create создается список из 24 элементов (от 97 до 120), каждый из которых добавляется в список с помощью процедуры ListAdd.
- В функции pr проверяется, является ли число простым.
- В функции kol число разбивается на цифры и подсчитывается их количество.
- В процедуре Show выводится информация о каждом элементе списка.
- В основном блоке кода создается список, выводится его содержимое, затем в цикле добавляются новые элементы в список, пока не будет достигнуто условие цикла.
- После окончания цикла выводится содержимое списка, затем он освобождается с помощью процедуры ListFree.