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

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

Форум «Всё о Паскале» _ Задачи _ Динамическая память Указатели

Автор: Tonny_Bennet 12.05.2007 19:50

задание такое : написать программу которая размещает в динамической памяти данные - действительные числа - в виде списка. Список создаётся путём последовательного добавления новых элементов в конец списка. Программа должна вывести список на экран и кроме того поменять местами первый и последний элементы списка и вновь вывести полученный список на экран.
Эту тему я понял неважно так что прогрмму полностью написать не смог.
Написал все процедуры по созданию списка, выводу на экран, поиска первого и последнего элемента списка. А вот как заменть первый и последний элемент я понять не могу. Подскажите пожалуйста.


Program pointers;
TYPE ElementPointer=^Element;

Element=record
datum:integer;
next:ElementPointer;
end;
VAR
list,l,k:ElementPointer;
n,x,a,b:integer;

Procedure NewElement(var l:ElementPointer; i:integer);
var q,p:ElementPointer;
begin
new(q);
q^.datum:=i;
q^.next:=nil;
if l=nil
then l:=q
else
begin
P:=l;
while p^.next<> nil do
p:=p^.next;
p^.next:=q;
end;
end;

Procedure PrintList(l:ElementPointer);
begin
if l=nil
then begin
writeln('<<< END >>>')
end
else begin
Writeln(l^.datum);
PrintList(l^.next)
end
end;

Procedure Poisk_poslednego(l:ElementPointer);
begin
if l<>nil
then begin
x:=l^.datum;
Poisk_poslednego(l^.next)
end
end;

Procedure Poisk_pervogo(l:ElementPointer);
begin
if l<>nil
then begin
b:=l^.datum;
end;
end;


BEGIN
list:=nil;
Writeln('Input numbers (input 0 for exit)');
readln(n);
while n<>0 do
begin
NewElement(list,n);
readln(n);
end;
Poisk_poslednego(list);
Poisk_pervogo(list);
Writeln('b= ',b,' x= ',x);
PrintList(list);
Readln
END.


Автор: volvo 12.05.2007 20:18

Если придерживаться того стиля, который ты используешь - то вот так:

procedure change;
var p: ElementPointer;
begin
list^.datum := x;
p := list;
while p^.next <> nil do p := p^.next;
p^.datum := b;
end;


Вызывать, соответственно, так:
...
Writeln('b= ',b,' x= ',x);
PrintList(list); { <--- До этого момента все так же, как и у тебя }
change;
PrintList(list);
...

Автор: Tonny_Bennet 12.05.2007 20:46

Огромное спасибо. Всё замечательно работает. Алгоритм я немного упростил но суть не поменялась. Ещё раз спасибо.

Procedure change(l:ElementPointer);
begin
l^.datum := x;
while l^.next <> nil do
l := l^.next;
l^.datum := b;
end;