Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание 2-х новых списков из элементов данного
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
MRK
Требуется описать процедуру, которая по списку L строит два новых списка:
L1- из положительных элементов и L2-изостальных элементов списка L
(Т.э.=real). 10 раз перечитал FAQ, но всё равно запутался и никак не могу разобраться. Застрял при написании процедуры 'vibor'. Хотя, наверное, лучше выбор сделать в самой программе, а не в процедуре. Помогите плииз. mega_chok.gif

program spiski;
uses crt;
type tinf=real; tp=^tel;
     tel=record
          inf:tinf;
          psled:tp;
         end;
var head:tp; m:real; otvet2:char; pe:tp;
{------------------------------------------}
procedure vsp(var iel:tinf; var head:tp);  {создание списка L}
var pe:tp; otvet:char;
  begin
    writeln ('Vedite elementi spiska L');
    writeln('Dlya zaversheniya vvoda nazmite "E"');
    repeat
     read(m);
     new(pe);
     pe^.inf:=iel;
     pe^.psled:=head;
     head:=pe;
     otvet:=readkey;
    until otvet='e';
  end;
{------------------------------------------}
procedure print(head1:tp);     {вывод  списка}
var pk:tp;
  begin
    writeln('Spisok');
    pk:=head;
    while pk<>nil do
      begin
        write(pk^.inf:5:2,' | ');
        pk:=pk^.psled
      end;
    writeln
  end;
{------------------------------------------}
procedure vibor(iel1:tinf;head2:tp);   {выбор из L и создание L1 и L2}
var pl1:tp; k:real;
  begin
    pl1:=head2;
    while pl1<>nil do
      begin
        if pl1^.inf>0 then
          new(pl1);
          pl1^.inf:=iel1;
          k:=iel1;
          pl1^.psled:=head2;
          head2:=pl1;
      end;
    writeln
  end;
{------------------------------------------}
begin
  repeat
  clrscr;
  vsp(m,head);
  print(head);
  vibor(head2);
  writeln ('Dlya vihoda iz programmi nazmite " Y "');
  otvet2:=readkey
  until otvet2='y';
end. 
volvo
Вот пример процедуры, создающей из одного списка еще 2 (старый список остается !!!) по заданному тобой критерию:
procedure split(l: tp; var first, second: tp);
var p: tp;
begin
  first := nil; second := nil;

  while l <> nil do begin
    new(p);
    p^.inf := l^.inf;

    if l^.inf > 0 then begin
      p^.psled := first;
      first := p
    end
    else begin
      p^.psled := second;
      second := p
    end;
    l := l^.psled;
  end;
end;


Кроме того, у тебя в программе есть явный недочет:
procedure print(head1:tp);     {вывод  списка}
var pk:tp;
  begin
    writeln('Spisok');
    pk:=head; { <--- Здесь !!! }
    while pk<>nil do
      begin
        write(pk^.inf:5:2,' | ');
        pk:=pk^.psled
      end;
    writeln
  end;
Если уж ты передаешь в процедуру указатель на список, который нужно распечатать, то будь добр и печатать его, а не то, на что указывает глобальная переменная...

Со вводом тоже какая-то морока, я так и не разобрался, чего ты хотел, для теста набросал свою процедуру ввода списка... blum.gif
MRK
Спасибо тебе огромное good.gif Всё получилось!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.