Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Динамические структуры

Автор: Akella 31.03.2009 20:35

Вот условие:
Создать в динамической памяти односвязный линейный список(цепочка) из n элементов. Заполнение информационных полей элементов списка(в моей проге это data) можно провести генератором случ. чисел. Реализировать процедуры: добавления элемента в любую точку списка, удаление, вывода на экран полученной в куче числ. посл-ти.
И еще одна процедура по пребразованию последовательности из x1,x2,x3,...xn надо получить (x1-xn),(x2-xn),...(xn-1 -xn) воть!

Теперь что у меня не работает:
1. выводит на экран на 1 элемент меньше (не знаю почечу)
2. процедура вставки некоректно работает при замене 1-го элемента
3. процедура удаления также не работает при удалении 1-го элемента
4. процедура преобразования отнимает не последний элемент, а какой попадется=(( вот... кто-чем сможет - помогите!!! rolleyes.gif


program lab_12_1;
uses crt;

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

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

procedure Vivod(P:point);
begin
writeln('Tekushaya posledivatelnost:');
repeat
write(P^.data,' ');
P:=P^.Next;
until
P^.Next=Nil;
end;

procedure Vstavka(var Pred:point; Nomer,Chislo:integer);
var
i:integer;
Vst:point;
begin
if Nomer=1 then begin
New(Vst);
Vst^.Data:=Chislo;
Vst^.Next:=Pred;
Pred:=Vst;
end
else for i:=1 to Nomer-2 do begin
Pred:=Pred^.Next;
end;
New(Vst);
Vst^.Data:=Chislo;
Vst^.Next:=Pred^.Next;
Pred^.Next:=Vst;
end;

procedure Udalenie(var Pred:point; Nomer:integer);
var
i,Chislo:integer;
Ud:point;
begin
if Nomer=1 then begin
Ud:=Pred;
Pred:=Pred^.Next;
Chislo:=Ud^.data;
Dispose(Ud);
end
else for i:=1 to Nomer-2 do begin
Pred:=Pred^.Next;
end;
Ud:=Pred^.Next;
Pred^.Next:=Pred^.Next^.Next;
Chislo:=Ud^.Data;
Dispose(Ud);
end;

procedure NovPosl(var P:point);
var
PBegin:point;
Chislo:integer;
begin
PBegin:=P;
while P^.Next <> Nil do begin
P:=P^.Next
end;
Chislo:=P^.Data;
P:=PBegin;
while P^.Next <> Nil do begin
P^.Data:=P^.Data-Chislo;
P:=P^.Next;
end;
end;



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

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

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

for i:=1 to n do begin
P^.Data:=random(100);
P^.Next:=Nil;
if i<n then begin
H:=P;
New(P);
H^.Next:=P;
end;
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(P,N)
end;
'a': begin
write('Vvedite poziciu novogo elementa: ');
read(n);
P:=PBegin;
Vstavka(P,N,0)
end;
'f': begin
P:=PBegin;
NovPosl(P);
end;
end;
clrscr;
P:=PBegin;
Vivod(P);
end;
until Simvol='e';
end.



если что спрашивайте, постараюсь ответить... однако не так быстро..

Автор: volvo 31.03.2009 21:06

Цитата
1. выводит на экран на 1 элемент меньше (не знаю почечу)
Потому, что выводишь неправильно. Сравни то, что было у тебя с этим:
procedure Vivod(P:point);
begin
writeln('Tekushaya posledivatelnost:');
while p <> nil do begin
write(P^.data,' ');
P:=P^.Next;
end;
end;

. Внутри NovPosl - то же самое, ты не обрабатываешь последний элемент. Почему тебя все время тянет сделать while p^.next = nil ? А последний (тот, у которого p^.next нулевой) ты обрабатывать не собираешься? Цикл же закончится как только ты с предпоследнего элемента переместишься к последнему, еще ДО обработки data...

Цитата
4. процедура преобразования отнимает не последний элемент, а какой попадется
3 раза запускал, все прекрасно с этим. Это ты просто последнего не видел (выше написано, почему), но он как раз отнимается.

Подозреваю, что и 2, 3 пункты тоже сбоят по схожей причине, проверь все циклы...

Автор: Akella 1.04.2009 5:00

сеодня на паре подумаю над 2 и 3...

Автор: Akella 1.04.2009 17:00

все.... нашел ошибки... в условных операторах не хватало begin'а