[Pascal]Процедура для списка данных
Никак не могу сообразить, как написать такую процедуру:
Элементами линейного соединенного списка являются целые числа.Напишите процедуру,
которая данный список удвоит, т.е. к концу списка присоединит еще копию каждого
числа с сохранением порядка последовательности.Например,из списка 1,2,3,4
получится список 1,2,3,4,1,2,3,4.
Буду очень благодарен за любые советы!
Элементами линейного соединенного списка являются целые числа.Напишите процедуру,
которая данный список удвоит, т.е. к концу списка присоединит еще копию каждого
числа с сохранением порядка последовательности.Например,из списка 1,2,3,4
получится список 1,2,3,4,1,2,3,4.
Буду очень благодарен за любые советы!
В чем собственно проблема?
Пишешь строку, запоминаешь ее значение, и затем к ней-же при выводи информации плюсуешь.
Это просто строка. Если надо только с числами, либо поставь проверку провописания, либо просто задай "integer" и так-же выводи:
Пишешь строку, запоминаешь ее значение, и затем к ней-же при выводи информации плюсуешь.
Это просто строка. Если надо только с числами, либо поставь проверку провописания, либо просто задай "integer" и так-же выводи:
Код: Выделить всё
uses crt;
var
s,s1:string;
begin
clrscr;
write('Input String: ');
readln(s);
S1:=S;
S:=S+S1;
writeln(s);
readln;
end.
Я, наверное, непонятно написал задание... Я вот пытаюсь написать, но пока не получается... Что-то подобное:
Код: Выделить всё
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;
-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
извините, не знаю, вроде тут тэга [MORE] нет, как прятать длинный текст, я не знаю ;-( можно, конечно, было бы через вложение сделать... но, как мне кажется, так удобнее...
aSn,
вот полное решение с оснасткой (чтобы проверить можно было ;-)
лишнее уберёте
сам модуль (переменовал в DOC1.PAS)
модуль для вызова:
и последнее, для работы с однонаправленным списком можно было обойтись и хранением только ссылки на первый элемент списка, хотя, безусловно, две ссылки - на голову и на конец - НАМНОГО удобнее...
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.
Serge_Bliznykov,
ОГРОМНОЕ Вам СПАСИБО! Просто и не знаю, как отблагодарить...
ОГРОМНОЕ Вам СПАСИБО! Просто и не знаю, как отблагодарить...

-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
aSn, а... не стоит прямо уж такой благодарности. ;-)))
Лишь бы на пользу пошло.
Приятно было засохшие мозги чуть поразмять, молодость вспомнить ;-)))
а скажите честно - код, который Вы привели - сами писали, или взяли у кого не разбираясь, что там и как?...
Лишь бы на пользу пошло.
Приятно было засохшие мозги чуть поразмять, молодость вспомнить ;-)))
а скажите честно - код, который Вы привели - сами писали, или взяли у кого не разбираясь, что там и как?...
Саму процедуру сам "сочинял", только никак не получалось - все время бесконечный цикл выходил
А интерфейс мы в универе делали.

-
- Сообщения: 375
- Зарегистрирован: 31 авг 2007, 03:06
ясно.
Ну молодец.
Желаю дальнейших успехов в учёбе.
Будут вопросы - милости прошу.
Ну молодец.
Желаю дальнейших успехов в учёбе.
Будут вопросы - милости прошу.