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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2016, 19:29   #1
IsKiN9
Новичок
Джуниор
 
Регистрация: 16.02.2016
Сообщений: 1
Вопрос Сдвиг эл-ов списка на одну позицию вправо

Помогите плз!
Дан ЛОС целых чисел.
1.Написать прогу циклического сдвига эл-ов списка на одну позицию вправо.
2.Заменить все отрицательные эл-ы списка на их корни.
Ввод эл-ов осуществил:
Код:
Type Point=^rec;
     rec=record
     inf : integer;
     sled : point;
end;
Var S,L : point;
   sr,sum, d : real; elem,k : integer;
begin
new(S);
L:=S;
L^.sled:=nil;
writeln('вв 1 эл-т списка:');
readln(elem);
while elem<>2 do begin
                 new(L^.sled);
                 L:=L^.sled;
                 L^.inf:=elem;
                 L^.sled:=nil;
                 writeln('Вв след. эл-т списка:');
                 readln(elem);
end;
а вот дальше....



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 16.02.2016 в 22:46.
IsKiN9 вне форума Ответить с цитированием
Старый 16.02.2016, 22:25   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

а дальше – двигай указатель. а данные пусть на месте остаются.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 16.02.2016, 23:10   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте такой код:
Код:
Type Point=^rec;
   rec=record
     inf : integer;
     sled : point;
end;

procedure PrintList(Head:Point);
var t:Point;
begin
  if Head=nil then WriteLn('Список пуст')
  else begin
    t:=Head;
    while t<>nil do begin
          Write(t^.inf,' ');
          t:=t^.sled
    end;
    WriteLn;
  end;
end;

Var S,L, Lprev : Point;
   sr,sum, d : real; elem,k : integer;
begin
S:=nil;
Lprev:=nil;
repeat
    writeln('Вв эл-т списка (2 for end):');
    readln(elem);
    if elem<>2 then begin
       if S=nil then begin
         New(S);
         L:=S;
       end
       else begin
            new(L^.sled);
            Lprev := L;
            L:=L^.sled;
       end;
       L^.inf:=elem;
       L^.sled:=nil;
     end;
until elem=2;

// печать списка
PrintList(S);

// если список не пуст
if S<>nil then begin
  // сдвиг
  // для этого нужно
  // 1) в последнем элементе указатель на sled должен указывать на голову списка
  L^.sled:= S;
  // 2) указатель головы на последний элемент
  S := L;
  // 3) если предыдущий элемент был,то ему sled нужно оборвать,
  //     иначе в списке всего один элемент, нужно разорвать циклическую ссылку
  if  Lprev<>nil then    Lprev^.sled := nil else S^.sled := nil;
  
  // печать списка после сдвига
  PrintList(S);
end;

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Побитовый сдвиг вправо (C) Skeich Помощь студентам 0 04.12.2013 11:40
Массивы: переворот, сдвиг вправо, перестановка _Лето_ Общие вопросы C/C++ 1 29.11.2013 15:12
Арифметический сдвиг вправо на n без VBA Romashka) Microsoft Office Excel 3 06.11.2012 18:47
Сдвиг массива вправо на 1 элемент stas45rus Помощь студентам 2 30.08.2011 14:20
сдвиг массива вправо tem_80 Общие вопросы C/C++ 5 01.02.2011 15:21