Кольцевой список, программа входит в бесконечный цикл - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д