PDA

Просмотр полной версии : [Pascal]Процедура для списка данных



aSn
04.01.2008, 17:04
Никак не могу сообразить, как написать такую процедуру:

Элементами линейного соединенного списка являются целые числа.Напишите процедуру,

которая данный список удвоит, т.е. к концу списка присоединит еще копию каждого

числа с сохранением порядка последовательности.Наприм р,из списка 1,2,3,4

получится список 1,2,3,4,1,2,3,4.

Буду очень благодарен за любые советы!

BHy4ok
04.01.2008, 18:51
В чем собственно проблема?
Пишешь строку, запоминаешь ее значение, и затем к ней-же при выводи информации плюсуешь.

Это просто строка. Если надо только с числами, либо поставь проверку провописания, либо просто задай "integer" и так-же выводи:


uses crt;
var
s,s1:string;
begin
clrscr;
write('Input String: ');
readln(s);
S1:=S;
S:=S+S1;
writeln(s);
readln;
end.

aSn
04.01.2008, 19:04
Я, наверное, непонятно написал задание... Я вот пытаюсь написать, но пока не получается... Что-то подобное:



unit doc;

interface
type Tdata = Integer;

uPrvek = ^prvek;

prvek = record
data: Tdata;
dalsi: uPrvek;
end;

seznam = record
hlava: uPrvek;
konec: uPrvek;

end;


procedure Kopie(var sez:seznam);



implementation

procedure Kopie(var sez:seznam);
var p,q:uPrvek;
z:Integer;
begin
new(p);
sez.konec:=p;

for z:= sez.hlava^.data to sez.konec^.data do

repeat
new(q);
sez.konec^.data:=q^.data;
sez.konec^.dalsi:=q;
sez.konec:=q;
until q <> p;

end;

Serge_Bliznykov
05.01.2008, 00:12
извините, не знаю, вроде тут тэга [MORE] нет, как прятать длинный текст, я не знаю ;-( можно, конечно, было бы через вложение сделать... но, как мне кажется, так удобнее...


aSn,
вот полное решение с оснасткой (чтобы проверить можно было ;-)
лишнее уберёте
сам модуль (переменовал в DOC1.PAS)


unit doc1;

interface
type Tdata = Integer;

uPrvek = ^prvek;

prvek = record
data: Tdata;
dalsi: uPrvek;
end;

seznam = record
hlava: uPrvek;
konec: uPrvek;
end;

var
MySezNam : seznam;

procedure InitPrvek(var sez:seznam);

procedure ListPrvek(var sez:seznam);

procedure Kopie(var sez:seznam);



implementation

procedure InitPrvek(var sez:seznam);
var p : uPrvek;
i : Integer;
begin
if sez.hlava <> nil then Exit;
new(p);
sez.hlava := p;
sez.konec := p;
sez.hlava^.data := 1;
sez.hlava^.dalsi := nil;
for i:=2 to 5 do begin
New(p);
sez.konec^.dalsi := p;
sez.konec := p;
p^.data := i;
p^.dalsi := nil;
end;

end;

procedure ListPrvek(var sez:seznam);
var
NextPrvek : uPrvek;
begin
if sez.hlava = nil then Exit;
NextPrvek := sez.hlava;
while NextPrvek <> nil do
begin
WriteLn(NextPrVek^.data);
NextPrvek := NextPrvek^.dalsi;
end;
end;


procedure Kopie(var sez:seznam);
var
KonecSourceList, CurElement, p : uPrvek;
begin
if sez.hlava = nil then Exit;

CurElement := sez.hlava;
KonecSourceList := sez.konec;
repeat
New(p);
sez.konec^.dalsi := p;
sez.konec := p;
p^.data := CurElement^.data;
p^.dalsi := nil;
CurElement := CurElement^.dalsi;
until CurElement=KonecSourceList;

{последний элемент исходного списка докопируем ручками...}
New(p);
sez.konec^.dalsi := p;
sez.konec := p;
p^.data := KonecSourceList^.data;
p^.dalsi := nil;

end;

begin
MySezNam.hlava := nil;
MySezNam.konec := nil;

InitPrvek( MySezNam );

end.


модуль для вызова:


uses Doc1;

begin
writeln('Source List before coping....');
ListPrvek( MySezNam );
WriteLn('----------------------');
Kopie( MySezNam );
WriteLn(' after coping ');
ListPrvek( MySezNam );
WriteLn('----------------------');
end.


и последнее, для работы с однонаправленным списком можно было обойтись и хранением только ссылки на первый элемент списка, хотя, безусловно, две ссылки - на голову и на конец - НАМНОГО удобнее...

aSn
05.01.2008, 17:27
Serge_Bliznykov,
ОГРОМНОЕ Вам СПАСИБО! Просто и не знаю, как отблагодарить... :)

Serge_Bliznykov
05.01.2008, 20:11
aSn, а... не стоит прямо уж такой благодарности. ;-)))
Лишь бы на пользу пошло.
Приятно было засохшие мозги чуть поразмять, молодость вспомнить ;-)))
а скажите честно - код, который Вы привели - сами писали, или взяли у кого не разбираясь, что там и как?...

aSn
05.01.2008, 20:36
Саму процедуру сам "сочинял", только никак не получалось - все время бесконечный цикл выходил :D А интерфейс мы в универе делали.

Serge_Bliznykov
05.01.2008, 23:59
ясно.
Ну молодец.
Желаю дальнейших успехов в учёбе.
Будут вопросы - милости прошу.