Помощь - Поиск - Пользователи - Календарь
Полная версия: Односвязный кольцевой список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Akella
Вот задачка! Первый пункт я сделал, все работает, но я не уверен что я применял правильные процедуры, т.к. сначало я делал для простого односвязного! А второй пункт не работает, где-то зацикливается! может я вообще не правильно составил алгоритм!
1))) создать в динамической памяти односвязный кольцевой список из 2n элементов (число n больше либо равно 1, задается пользователем) заполнение информационных полей элементов списка можно провестит генератором случайных чисел в диапозоне [0..100]. реализовать процедуры добавление элементов в любую точку списка, удаление любого члена из списка, вывод на экран полученной в куче числовой последовательности. 2))) из полученной динамической числовой пос-ти X1, X2, ...X2n вычислить: s={X1+Xn+1,X2+Xn+2,...Xn+X2n} запрещается использовать массивы. , т.е. нужно получить новую последовательность
которая в два раза меньше по длине!

program lab_12_dinamika_odnosvyaz_kolc;
uses crt;

type
point=^element;
element=record
Data:integer;
Next:point;
end;

var
P,H,PBegin : point;
i,n,Dlina : integer;
MemBegin : longint;
Simvol : char;

procedure Vivod(P:point);
var
First : pointer;
Dlina : integer;
begin
Dlina:=0;
First:=P;
writeln('Tekushaya posledivatelnost:');
while P^.Next <> First do begin
write(P^.data,' ');
P:=P^.Next;
inc(dlina);
end;
writeln;
writeln;
writeln('*Dlina posledovatelnisti=',dlina,'*');
writeln;
end;

procedure Vstavka(var P:point; Nomer,Chislo:integer);
var
i : integer;
N,Z : point;
begin
Z:=P;
if Nomer=1 then begin
New(N);
N^.Data:=Chislo;
N^.Next:=Z;
while Z^.Next <> P do Z:=Z^.Next;
Z^.Next:=N;
P:=N;
end
else begin

for i:=1 to Nomer-2 do begin
Z:=Z^.Next;
end;
writeln(Z^.Data);
New(N);
N^.Data:=Chislo;
N^.Next:=Z^.Next;
Z^.Next:=N;
end;
end;

procedure Udalenie( P:point; Nomer:integer);
var
i,Chislo : integer;
U,Z,First : point;
begin
Z:=P;
if Nomer=1 then begin
U:=Z;
First:=Z^.Next;
while Z^.Next <> PBegin do Z:=Z^.Next;
Z^.Next:=First;
Chislo:=U^.data;
Dispose(U);
PBegin:=First;
end
else begin
for i:=1 to Nomer-2 do begin
P:=P^.Next;
end;
U:=P^.Next;
P^.Next:=P^.Next^.Next;
Chislo:=U^.Data;
Dispose(U);
end;
end;

procedure NovPosl(var P:point); {неработающая процедура, зацикливается=(}
var
N,Z,T,Index : point;
X,Y:integer;
begin
Z:=P;
new(N);
PBegin:=N;
for i:=1 to (Dlina div 2) do begin {Dlina должна быть четная!!}
X:=Z^.data;
Index:=Z;
for i:=1 to (Dlina div 2) do Z:=Z^.Next;
Y:=Z^.Data;
N^.Data:=X+Y;
Z:=Index^.Next;
New(T);
N^.Next:=T;
T^.Next:=PBegin;
N:=T;
end;
P:=PBegin;
end;



begin {----------------------------}
clrscr;
randomize;

New(P);
PBegin:=P;
MemBegin:=MemAvail;

write('Vvedite kol-vo elementov: '); readln(N);

for i:=1 to 2*n do begin
P^.Data:=random(100);
New(H);
P^.Next:=H;
H^.Next:=PBegin;
P:=H;
end;
p:=PBegin;
Vivod(PBegin);
N:=0;
writeln;
writeln;

repeat begin
writeln('Najmit:');
writeln('D - udalit element');
writeln('A - dobavit element');
writeln('F - preobrazovanie');
writeln('E - vihod');
Simvol:=readkey;
case Simvol of
'd': begin
write('Vvedite poziciu elementa: ');
read(N);
P:=PBegin;
Udalenie(PBegin,N)
end;
'a': begin
write('Vvedite poziciu novogo elementa: ');
read(n);
Vstavka(PBegin,N,0)
end;
'f': begin
P:=PBegin;
NovPosl(P);
end;
end;
clrscr;
Vivod(PBegin);
end;
until Simvol='e';



end.




Заранее СПАСИБО! rolleyes.gif
volvo
Процедура NovPosl:
  PBegin:=N;
for i:=1 to (Dlina div 2) do begin {Dlina должна быть четная!!}
X:=Z^.data;
Index:=Z;
for i:=1 to (Dlina div 2) do Z:=Z^.Next; { <--- В принципе, дальше можно не смотреть }
, потому что изменение управляющей переменной цикла For собственноручно - запрещено. Этим занимается сам цикл.

Загляни в поиск, кстати. Там было несколько программ на тему кольцевых (циклических) списков... Что-то связанное с Ring...
Akella
Цитата(volvo @ 10.05.2009 16:31) *

Процедура NovPosl:
  PBegin:=N;
for i:=1 to (Dlina div 2) do begin {Dlina должна быть четная!!}
X:=Z^.data;
Index:=Z;
for i:=1 to (Dlina div 2) do Z:=Z^.Next; { <--- В принципе, дальше можно не смотреть }
, потому что изменение управляющей переменной цикла For собственноручно - запрещено. Этим занимается сам цикл.

Загляни в поиск, кстати. Там было несколько программ на тему кольцевых (циклических) списков... Что-то связанное с Ring...

ээээ? а как тогда делать?? blink.gif в поиске ничего полезного не нашел! извините unsure.gif
Lapp
Цитата(Akella @ 10.05.2009 15:11) *
ээээ? а как тогда делать?? blink.gif
Хороший вопрос!
а попробовать использовать другую буковку не хочешь? Например, j.. Или у тебя на клаве все клавиши, кроме "i", не работают?.. blink.gif (Программу не смотрел, но такое решение вопроса просто само напрашивается)
Akella
ой я просто ошибся=)) но все равно что-то не хочет работать=((
Akella
ну помогите плиз! не знаю в чем причина! я тупой=)))
Цитата

Процедура NovPosl:
PBegin:=N;
for i:=1 to (Dlina div 2) do begin
X:=Z^.data;
Index:=Z;
for j:=1 to (Dlina div 2) do Z:=Z^.Next; {исправил на др переменную, но все равно не хочет не понимаю=(((}
Akella
все спасибо! не надо нашел свою ошибку!
Lapp
Цитата(Akella @ 12.05.2009 17:56) *
все спасибо! не надо нашел свою ошибку!
Бальзам на сердце..))
Akella
Цитата(Lapp @ 13.05.2009 1:04) *

Бальзам на сердце..))

дяяя.... smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.