На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Список. Указатели. Помогите.
    Ребят, у меня большая просьба. Может это кому-то покажется как нечего делать, но мне сложно разобраться в линейном списке. Я тут обложился книгами, но понял не много, вот написал программку, которая добавляет элементы в список и выводит, что-то не работает, и еще некоторые строчки не понятны и в книге не прокомментированы, объясните?
    я учусь пока программировать.....
    ExpandedWrap disabled
      program ochered;
      uses crt;
      type
      p=^item;
      item=record
      info: string[20];
      next: p;
      end;
      var
      Po,PoE,PoB: p;
      i: integer;
      x: string[20];
      begin
      clrscr;
      write('Введите значение: ');
      readln(x);
      new(Po);
      Po^.info:=x;
      Po^.next:=nil;
      {------------------------------}
      { <<  Как объяснить эти две строчки? }
      PoB:=Po;                      
      PoE:=Po;                      
      {------------------------------}
      i:=1;
      repeat
      write('Введите значение: ');
      readln(x);
      new(Po);
      Po^.info:=x;
      Po^.next:=nil;
      {------------------------------}
      { << Как объяснить эти две строчки? }
      PoE^.next:=Po;                
      PoE:=Po;                      
      {------------------------------}
      until x='q';
      {-------------------------------------------}
      {А это видимо совсем не правильно,          
      т.к. без книг писал, сам неразобравшись... }
      PoE^.next:=nil;                            
      while PoE<>nil do                          
      begin                      
      writeln(Po^.info);            
      Po:=Po^.next;                  
      end;                      
      {--------------------------------------------}
      end.
    Сообщение отредактировано: Romtek -
      ExpandedWrap disabled
        PoB:=Po;
        PoE:=Po;

      * Это указатели на первый и последний элемнт в списке соответственно... Т.к. введено только одно значение, первый и последний элемент находится по выделенному адресу Po.
      ExpandedWrap disabled
        PoE^.next:=Po;
        PoE:=Po;

      * Здесь ситуация такая: PoE (до исполнения этих строк) ещё указывает на первый элемент, так что первая строка просто заносит в next указатель на только что созданный элемент. А вторая строка присваивает PoE адрес последнего (только что созданного элемента).
      ExpandedWrap disabled
        PoE^.next:=nil;
        while PoE<>nil do
        begin
        writeln(Po^.info);
        Po:=Po^.next;
        end;

      * Здесь так: PoE^.next уже имеет значение nil, т.к. было выполнено (последнее) Po^.next:=nil; . Подумай: PoE указывает на последний элемент, значит на последний созданный Po.
      * PoE у тебя не меняется внутри While, так что While у тебя будет бесконечным...
      * Попробуй так:
      ExpandedWrap disabled
        Po := PoB;
        While Po <> nil do
        Begin
           WriteLn(Po^.info);
           Po := Po^.next
        End;
      Сообщение отредактировано: Romtek -
        В предыдущей программе я понял как создать добавление в список, но там реалезуется добавление с конца, а теперь я немного перестроил ее, так, чтобы добавление шло в начало списка, так вот что-то не работает, гляньте пожалуйста?
        ExpandedWrap disabled
          program ochered;
          uses crt;
          type
          p=^item;
          item=record
          info: string[20];
          next: p;
          end;
          var
          Po,PoE,PoB: p;
          i: integer;
          x: string[20];
          begin
          clrscr;
          write('Введите элемент: ');
          readln(x);
          new(Po);
          Po^.info:=x;
          Po^.next:=nil;
          PoB:=Po;
          PoE:=Po;
          repeat
          write('Введите элемент: ');
          readln(x);
          new(Po);
          Po^.info:=x;
          //Вот тут в новосозданный указатель помещяаю значение на предыдущий, так? (этот новый как бы перед предыдущим стоит, т.к. в начало добавление, а не в конец где nil присваиваем...)
          Po^.next:=PoE;
          //и тут PoB получает адресс только-что новосозданного элта, так?
          PoB:=Po;
          until x='q';
          //Вот тут в начало как бы скачок идет, где лежит последнее введенное значение, так?
          Po:=PoB;
          while Po<>nil do
          begin
          //Так а чего он печатать начинает не так? (ну я вводил например q1 q2 q3 q4 q и по идее печатать должен q q4 q3 q2 q1 раз в начало добавляли, а он на q1 прерывается да еще и НАЧИНАЕТ с него печатать, вернее q q1 и все... а должен на q1 прирваться, когда все предыдущие распечатает.....)
          writeln(Po^.info);
          Po:=Po^.next;
          end;
          end.
        Сообщение отредактировано: Romtek -
          ExpandedWrap disabled
            program ochered2;
            uses crt;
            type
            p=^item;
            item=record
            info: string[20];
            next: p;
            end;
            var
            Po,PoE,PoB: p;
            i: integer;
            x: string[20];
            begin
            clrscr;
            write('Введите элемент: ');
            readln(x);
            new(Po);
            Po^.info:=x;
            Po^.next:=nil;
            PoB:=Po;
            PoE:=Po;
            repeat
            write('Введите элемент: ');
            readln(x);
            new(Po);
            Po^.info:=x;
            Po^.next:=PoB;PoB:=Po;
            until x='q';
            Po:=PoB;
            while Po<>nil do
            begin
            writeln(Po^.info);
            Po:=Po^.next;
            end;
            end.


          Как видишь поменялось немногое...
          Сообщение отредактировано: Romtek -
            Одно меня смущает... Если вы все равно смотрите в nil - то зачем вам переменные начала и конца списка? Разве неясно, что первый nil - начало, а второй - конец?
              NOPIKу
              Получается, что я лишний1 указатель чтоли ввел? да это в книжке так, я просто разбираться пытаюсь...
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0302 ]   [ 14 queries used ]   [ Generated: 12.05.24, 09:12 GMT ]