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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2011, 16:06   #1
Yelisey
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 19
Восклицание Линейные списки. Паскаль

Здравствуйте!! Помогите с задачей!! Не могу написать для нее код!


Используйте линейные списки для хранения последовательности чисел. Опишите процедуру или функцию, которая:
а) вставляет в список L за первым вхождением элемента E все элементы списка L1, если E входит в L.
б) удаляет из списка L все элементы, которые есть в списке L1.
Yelisey вне форума Ответить с цитированием
Старый 18.04.2011, 18:01   #2
Yelisey
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 19
По умолчанию

Код составил! Мне Free Pascal при вводе элементов ошибку 216 выдает.

Код:
uses crt;
type

    PList=^RList ;
    RList=Record
    Info : string ;
    Next : PList
  End ;


var
   l,p,            { список }
   beg : plist;   { указатель на начало списка  }
   k,i,j : integer;
   s : string;


{ процедура меняет в списке L строк местами }
procedure move(l:plist;i,j:integer);
var
   p1,p2:plist;
   s:string;
   q1,q2:integer;
   b1,b2:boolean;
begin
     q1:=0;q2:=0;
     b1:=false; b2:=false;
     while l<>nil do
       begin
            inc(q1);
            inc(q2);
            if q1=i then begin p1:=l; b1:=true; end;
            if q2=j then begin p2:=l; b2:=true; end;
            l:=l^.next;
       end;
    {меняю строки местами }
     if b1 and b2 then
       begin
            s:=p1^.info;
            p1^.info:=p2^.info;
            p2^.info:=s;
       end
end; { move }

{Процедура замены строк  }
procedure new_str(l:plist; i,k:integer);
var
   j:integer;
begin
       p:=l;
       j:=0;
     while l<>nil do
       begin
            inc(j);
            if j=k then
              begin
                   s:=l^.info;
                   break; 
              end;
            l:=l^.next
       end;

     l:=p;
     j:=0;
     while l<>nil do
       begin
            inc(j);
            if j=i then
              begin
                   l^.info:=s;
                   break; 
              end;
            l:=l^.next
       end;
end; { new_str }


{ Процедура добавления элемента в список }
procedure addrec(var l:plist; s:string);
var
   p:plist;
begin
     if l=nil then
       begin
            new(p);
            p^.info:=s;
            l^.next:=p;
            p^.next:=nil;
            l:=p;
       end
     else addrec(l^.next,s);
end; { addrec }

{Процедура вывода списка  }
procedure print(l:plist);
begin
     if l<>nil then
       begin
            write(l^.info,'  ');
            print(l^.next);
       end
end; { print }

begin
     clrscr;
     write('‚Введите количество строк ');
     readln(k);
     {ввод строк и формирование списка  }
     for i:=1 to k do
       begin

            write('‚ введите строку');
            readln(s);


            if i=1 then beg:=l; { * начало списка  }

       end;
            addrec(l,s);
            writeln;


       write('’ текущий список');
       print(beg);writeln;

       write('‚ введите номера строк которые надо поменять');
       readln(i,j);
       move(beg,i,j);
       write('’ текущий список');
       print(beg); writeln;

       write('‚введите номер строки на которую хотите поменять ');
       readln(i,k);
       new_str(beg,i,k);
       write('’Текущий список ');
       print(beg);writeln;



       write('Текущий список ');
       print(beg); writeln;

readkey;
end.


Вот! Когда убрал addrec(l,s); то ошибка исчезла, но списки пустые и не выполняется никаких действий! Эта процедура нужна для вывода но с ней не пашет! Помогите разобраться пожалуйста!!


________
Для выделения исходного кода, выделите его
и заключите в теги [CODE] ТУт Ваш Исходный Код [/СODE]
(выделите код и нажмите кнопочку с решёточкой #)
Модератор.

Последний раз редактировалось Serge_Bliznykov; 18.04.2011 в 21:54.
Yelisey вне форума Ответить с цитированием
Старый 21.04.2011, 16:41   #3
Ermowkin
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 23
По умолчанию

У вас S принимает только значение последней вводимои строки.
Код:
     for i:=1 to k do
       begin

            write('‚ введите строку');
            readln(s);


            if i=1 then beg:=l; { * начало списка  }

       end;
Ermowkin вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейные списки ]tach[ Помощь студентам 0 19.01.2011 16:59
Линейные списки svt Помощь студентам 1 20.11.2010 08:22
Линейные списки Dead Romantic Помощь студентам 0 30.05.2010 21:35
Линейные списки ManU Помощь студентам 1 03.11.2008 21:20