Помощь - Поиск - Пользователи - Календарь
Полная версия: Односвязный кольцевой список
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.