Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 14:45   #1
Rediska512
Пользователь
 
Регистрация: 16.02.2012
Сообщений: 16
По умолчанию Линейные списки.

Создать список целых чисел. Вывести на экран все числа, которые больше заданного числа, и удалить их из списка.
Код:
Program spusku;
uses crt;
type
   spusok=^elem;
   elem=record
           data:integer;
           next:spusok;
           end;
var i:spusok;

procedure add(var current:spusok; elem:integer);
var x:spisok;
begin
   new(x);
   x^.data:=elem;
   x^.next:=nil;
   current^.next:=x;
   current:=x;
end;

procedure stvor(var i:spusok);
var p:spisok; n:integer;
begin
   i:=nil;
   writeln('Vvedite spusok celux 4usel. 0-konec');
   readln(n);
   add(i,n);
   readln(n);
   while n<>0 do
   begin
   p:=i;
      while p^.next<>nil do
      p:=p^.next;
      add(p,n);
      readln(n);
   end;
end;

procedure vuvod(var i:spusok);
var p:spusok; k:integer;
begin
   writeln('Vvedute 4uslo');
   readln(k);
   while i<>nil do
   begin
      p:=i;
      if p^.data>k then write(p^.data:3);
      i:=i^.next;
      dispose(p);
   end;
end;

BEGIN
clrscr;
stvor(i);
vuvod(i);
readkey;
end.
Надо добавить процедуру вывода списка из которого удалены числа больше k

подскажите как это сделать, а то я пробовал и не получилось,
менял процедуру vuvod:
Код:
   while i<>nil do
   begin
      p:=i;
      i:=i^.next;
      if p^.data>k then begin write(p^.data:3);
                                       dispose(p);
                               end;
   end;
и добавлял процедуру
Код:
procedure vuvod2(var i:spusok);
begin
   while i<>nil do
   begin
      write(i^.data:3);
      i:=i^.next;
   end;
end;
но в итоге после чисел больших k
выводилось просто число k и все,
подскажите кто знает что поменять.
Rediska512 вне форума Ответить с цитированием
Старый 30.03.2012, 21:54   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Во-первых, разные имена spusok и spisok
Далее при добавлении идёт запись в поле current^.next, хотя объект по адресу current ещё не создан. При проходе по списку теряется голова. ИМХО, лучше делать через двусвязный список, но если хочется, то можно и со стеком побаловаться - в процедуре del идёт удаление из стека с сохранением "нужных" чисел. Правда в таком случае пришлось ввести дополнительную переменную для установления связи с предыдущим числом.
Код:
type
   spisok=^elem;
   elem=record
           data:integer;
           next:spisok;
           end;

procedure add(var head:spisok; elem:integer);
var x:spisok;
begin
   new(x);
   x^.data:=elem;
   x^.next:=head;
   head:=x;
end;

procedure del(var head:spisok);
var current,p,prev:spisok; k:integer;
begin
   current:=head;
   prev:=head;//для связи предыдущего и следуещего при удалении текущего
   writeln('Vvedute 4uslo');
   readln(k);
   while current<>nil do
   begin
      if current^.data>k then
      begin
        write(current^.data:3);
        if current=head then
          head:=head^.next
        else
          prev^.next := current^.next;
        p:=current;
        current:=current^.next;
        dispose(p);
        continue;
      end;
      prev:=current;
      current:=current^.next;
   end;
end;

procedure stvor(var head:spisok);
var p:spisok; n:integer;
begin
   head:=nil;
   writeln('Vvedite spusok celux 4usel. 0-konec');
   readln(n);
   while n<>0 do begin
     add(head,n);
     readln(n)
   end;
end;

procedure vuvod(i:spisok);
var p:spisok;
begin
  writeln;
  writeln('ostatok: ');
   while i<>nil do
   begin
      p:=i;
      write(p^.data:3);
      i:=i^.next;
      dispose(p);
   end;
end;

var
  head: spisok;
BEGIN
  stvor(head);
  del(head);
  vuvod(head);
  readln
end.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейные списки mishanya6 Помощь студентам 0 22.12.2011 21:25
Линейные списки stck Общие вопросы C/C++ 0 02.06.2011 22:00
Линейные списки Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 0 04.04.2011 22:18
Линейные списки Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 3 26.04.2010 09:24