Помощь - Поиск - Пользователи - Календарь
Полная версия: ОДНОСВЯЗНЫЕ СПИСКИ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Toni_
Задача. Разработайте программу слияния двух односвязных упорядоченных по не убыванию линейных списков в один упорядоченный список.

Вобщем вот до чего я дошел. Народ вопрос как сделать так чтобы я вводил по 1 элементу? а не водил скока я хочу вести елементов..... Помогите кто чем можетsmile.gif


Program spisok_PR_15;
uses crt;
type link=^item;
item=record
data:integer;
ref:link;
end;

var px,py:link; n,i:integer; a:^integer; ch:char;

Procedure vivod;
begin
While py<>nil do {Vivod spiska}
begin
write(py^.data,' ');
py:=py^.ref
end;
end;
begin

repeat
clrscr;
writeln('1.Sosdadim 1 spisok');
writeln;
writeln('2.Sosdadim 2 spisik');
writeln;
writeln('3.Soedinim spiski');
writeln;
writeln('4.Vivod 1 spiska');
writeln;
Writeln('0.Exit');
Readln(ch);
Case ch of

#49: {1}
begin
px:=nil;
{sozdanie spiska, Также я тут задаю количество вводимых элементо,
как сделать так чтобы я вводил по 1 элементу}
Writeln('Kolichestvo vvodimix elementov');
Read(n);
For i:=1 to n do
begin
New(py);
Read(a^);
py^.data:=a^;
py^.ref:=px;
px:=py;
{end;}
end;

#52: {4 }
begin
While py<>nil do {Vivod spiska}
begin
write(py^.data,' ');
py:=py^.ref
end;
readkey;
end;
end
until ch=#48; {0}
end.
Lapp
Цитата(Toni_ @ 4.01.2011 0:47) *
Вобщем вот до чего я дошел.
Неплохо )).
Но все же выкладывай компилирующийся код, если он есть. Мне пришлось каскомментировать один end. Кроме того, я причесал код (отформатировал) и убрал совершенно непонятное "a", которое не было аллоцированно и крэшило прогу (к счастью, оно оказалось совершенно ненужным)). Вот, "до чего я дошел" smile.gif :
Program spisok_PR_15;
uses crt;
type
link= ^item;
item= record
data: integer;
ref: link;
end;

var
px,py: link;
n,i: integer;
ch: char;

Procedure vivod;
begin
While py<>nil do {Vivod spiska} begin
write(py^.data,' ');
py:=py^.ref
end;
end;

begin
repeat
clrscr;
writeln('1.Sosdadim 1 spisok');
writeln;
writeln('2.Sosdadim 2 spisik');
writeln;
writeln('3.Soedinim spiski');
writeln;
writeln('4.Vivod 1 spiska');
writeln;
Writeln('0.Exit');

Readln(ch);
Case ch of
'1': begin
px:=nil;
{sozdanie spiska, Также я тут задаю количество вводимых элементо,
как сделать так чтобы я вводил по 1 элементу}
Writeln('Kolichestvo vvodimix elementov');
Read(n);
For i:=1 to n do begin
New(py);
Read(py^.data);
py^.ref:=px;
px:=py;
end;
end;
'4': begin
While py<>nil do begin {Vivod spiska}
write(py^.data,' ');
py:=py^.ref
end;
readkey;
end;
end
until ch='0'
end.



Цитата
Народ вопрос как сделать так чтобы я вводил по 1 элементу? а не водил скока я хочу вести елементов..... Помогите кто чем можетsmile.gif
Тебе и не снилось, что мы можем. Ты только говори яснее.
Что значит "по 1 элементу"? То есть прекращать ввод по какому-то признаку?
Самое простое - выбрать какое-то число, как признак окончания ввода (например, 0). Но тогда в твой список невозможно будет ввести это число.
Второй способ: вводить не число, а строку, и переводить эту строку в число в программе. Тогда можно будет прекращать ввод по вводу слова "end" (или любого другого).
Третий способ: вводить посимвольно, составлять строку и переводить ее в число. Тогда можно будет сделать окончание ввода по нажатии, например, Esc.
Четвертый и последний способ довольно простой (проще 2 и 3). Он содержит некоторый трюк. Можно отключать проверку ошибок ввода - а точнее - брать ее на себя. И выходить из цикла ввода по ошибке. Тогда для выхода нужно просто ввести любой нецифровой символ (например, A или q, или ф..). Делается примерно так:
Stop:=false;
repeat
Write('Введите очередной элемент: ');
{$I-} ReadLn(x); {$I+}
if IOResult=0 then begin
{тут добавление элемента в список}
end
else Stop:=true
until Stop;

Попробуй и спрашивай, что непонятно.

PS
Еще, просьба к тебе: используй теги code=pas
volvo
Цитата
Неплохо )).
Ничего хорошего, кстати.

Во-первых, на кой делали процедуру вывода если по нажатию "4" опять ту же процедуру "растворяем" в программе?

Во-вторых: простейшая логика. Если я ввел 3 элемента списка: <1, 2, 3>, запрашиваю вывод только что введенных данных, и мне печатается <3, 2, 1> - у меня тут же сработает рефлекс: я нажму на 0 для выхода, и поставлю автору неуд. Ибо список должен обрабатываться и показываться мне не "задом наперед" (потому что так удобнее программисту), а так, как я его вводил (потому что так удобнее пользователю). Тем более, что я ввел действительно упорядоченные по неубыванию данные, а что мне будет выдано в итоге?
Lapp
Цитата(volvo @ 4.01.2011 10:10) *
Ничего хорошего, кстати.
Все же гораздо лучше, чем ничего (или чем ворованное). Человек, сделавший что-то сам, определенно заслуживает похвалы и поощрения. yes2.gif
А недочеты - это исправимо )).
Toni_
Lapp большое спс за испровления ошибокsmile.gif буду дальше разбираться cool.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.