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

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

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

> Односвязный кольцевой список, Требуется проверка и помощь!
Akella
сообщение 10.05.2009 7:48
Сообщение #1


Пионер
**

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

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


Вот задачка! Первый пункт я сделал, все работает, но я не уверен что я применял правильные процедуры, т.к. сначало я делал для простого односвязного! А второй пункт не работает, где-то зацикливается! может я вообще не правильно составил алгоритм!
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

Сообщение отредактировано: Akella - 10.05.2009 7:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 10.05.2009 8:31
Сообщение #2


Гость






Процедура 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...
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 18.07.2025 14:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"