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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2014, 16:43   #1
s24g
 
Регистрация: 27.03.2014
Сообщений: 7
По умолчанию Замена второго элемента односвязного списка на предпоследний элемент

Есть процедура(Change_node), где меняется местами первый и предпоследний элементы списка (общий случай) и частные случаи, а как сделать чтоб поменялся второй и предпоследний понять не могу. Кому не лень исправьте. Заранее спасибо))
Код:
Program List; 
 {obmen mestami pervogo i predposlednego elementov spiska}
Uses crt; 
Type  u =^zap;       
       zap = record      {struktura elementa spiska}
          inf : integer; 
          ukz : u; 
       end; 
Var PSP : u;             {ykazatel' spiska}
           ch : integer;
Procedure Create_List (Var PSP:u); 
 {sozdanie neyporyadochevanogo spiska}
Var  q,           {ykazatel' na predidyshii element spiska}
p : u;           {ykazatel' na tekyshie  element spiska  }
ch : char;
Begin 
New(q);
WriteLn ('vvedite informachionnoe pole elementa:');
ReadLn (q^.inf);
   PSP:=q;
   WriteLn ('Prodoljit vvod? y/n');
ch:=ReadKey;
While ch In ['y','Y','h','H'] do
Begin
New(p);
         WriteLn ('vvedite informachionnoe pole elementa');
ReadLn (p^.inf);
q^.ukz:=p;
q:=p;
WriteLn ('Prodoljit vvod?  y/n');
ch:=ReadKey;
End;
q^.ukz:=nil;
End;
Procedure Print_list(PSP:u);
       { аechat elementov spska, PSP - ykazatel' spiska  }
Var t:u;
Begin
   If PSP=nil then
      begin
        WriteLn ('Spisok pyst');
         ReadKey;
         Exit;
      end;
  Writeln ('Spisok:');
  t:=PSP;
  While t <> nil do
      begin
          Write (t^.inf,' --> ');
           t:=t^.ukz;
      end;
  WriteLn ('NIL');
  WriteLn ('Najmita lybyu klavishy');
  Readkey;
End;
 
Procedure Destroy_list(Var PSP:u);
 { osvobojdenie pamyati, zanytoi elementami spiska}
Var t:u;
Begin
    While PSP <> nil do
        begin
            t:=PSP;
            PSP:=PSP^.ukz;
            Dispose(t);   {osvobojdenie pamyati}
        end;
End;
 
Procedure Change_node (Var PSP:u);
{obmen pervogo i predposlednego elementov spiska}
Var q, s, t : u;
Begin
If (PSP=nil) or (PSP^.ukz=nil) or (PSP^.ukz^.ukz=nil)  then
 begin
           WriteLn ('V spiske menshe 3-h elementov');
             Print_list(PSP);
           exit;
       end;
           {poisk predposlednego elementa}
      q:=PSP;
      s:=PSP^.ukz;   {s - ykazatel' na predposlednii element}
      While s^.ukz^.ukz<>nil do
           begin
              q:=s;
              s:=s^.ukz;
           end;
       If q=PSP then    {osobii slychai-obmen 1-go i 2-go elementov}
          begin
              q^.ukz:=s^.ukz;
              s^.ukz:=q;
              PSP:=s;
              WriteLn ('Obmen 1-go s 2-go elementov vipolnen');
              Readkey;
              Exit
          end;
     {obchii slychai}
       t:=PSP^.ukz;
       PSP^.ukz:=s^.ukz;
       s^.ukz:=t;
       q^.ukz:=PSP;
       PSP:=s;
       WriteLn ('Obmen elementov vipolnen');
       Readkey;
End;
 
 
Begin
     PSP:=nil;
     Repeat
       ClrScr;
       WriteLn ('1 -Sozdat spisok');
       WriteLn ('2 -Prosmotret spisok');
       WriteLn ('3 -Pomenyat mestami pervii i predposlednii elementi ');
       WriteLn ('4 -Ydalit spisok');
       WriteLn ('---------------------------------------------------------');
       WriteLn ('0 -Vihod');
       WriteLn;
       Write ('Vash vibor:');
       readln(ch);
 
       WriteLn;
 
       Case ch of
1:begin
   PSP:=nil;
   Create_list(PSP);
   end;
2: Print_list(PSP);
3: Change_node(PSP);
4: begin
   Destroy_list(PSP);
   Writeln ('Spisok ydalyon!');
   Readkey;
  end;
       end; {case}
   until ch=0;
End.
s24g вне форума Ответить с цитированием
Старый 14.11.2014, 21:21   #2
s24g
 
Регистрация: 27.03.2014
Сообщений: 7
По умолчанию

Помогите, очень надо, а как 2-й с предпоследним поменять просто не соображу. Кому не лень посмотрите, пожалуйста. Заранее спасибо))
s24g вне форума Ответить с цитированием
Старый 15.11.2014, 09:56   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну сделай себе функцию поиска.
Что-то типа:
Код:
function Find(n:integer):u;
var i:u;
begin
 if n<0 then n=Count+n;
 i:=PSP;
 while (i<>nil)and(n>0) do begin
  i=i.ukz;
  dec(n);
 end;
 Result:=i;
end;
Соответственно:
Код:
var q,w:u;
...
q:=Find(2); //Найден второй элемент
w:=Find(-2); //Найден предпоследний
Обращаю внимание на два момента:
1) Нужна функция или переменка, которая бы хранила кол-во элементов в списке.
2)Писал это с потолка, так что не копипастить. Разобраться в идее и подогнать под себя.

Все яснышко?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2014, 16:45   #4
s24g
 
Регистрация: 27.03.2014
Сообщений: 7
По умолчанию

Цитата:
1) Нужна функция или переменка, которая бы хранила кол-во элементов в списке.
А можно как-то без функций, просто в этом куске
Цитата:
{obchii slychai}
t:=PSP^.ukz;
PSP^.ukz:=s^.ukz;
s^.ukz:=t;
q^.ukz:=PSP;
PSP:=s;
WriteLn ('Obmen elementov vipolnen');
Readkey;
как-то переставить указатель, чтоб вместо первого элемента был второй?
s24g вне форума Ответить с цитированием
Старый 17.11.2014, 17:22   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А чем функция не угодила?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.11.2014, 17:35   #6
s24g
 
Регистрация: 27.03.2014
Сообщений: 7
По умолчанию

Не знаю мне просто кажется мороки будет меньше, просто переставить указатель, только я понять не могу где это надо сделать.
s24g вне форума Ответить с цитированием
Старый 17.11.2014, 18:17   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Фраза "как-то сделать" это из области "тыжпрограммизма". Я инженер, я стараюсь мыслить не "как-то" а "как именно", поэтому других предложений от меня не поступит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента по названию из односвязного списка samsandr Помощь студентам 0 28.05.2014 02:16
удаление элемента односвязного списка. язык СИ. всего 5 строчек кода, много времени не займет. MisterTreb Помощь студентам 0 08.01.2013 15:17
сортировка односвязного списка Levenyatko Общие вопросы C/C++ 0 05.07.2012 22:12
как записать предпоследний элемент очереди в ячейку? taorange Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2010 21:38
Мин. элемент. односвязного списка в СИ Sultan237 Общие вопросы C/C++ 0 22.03.2010 23:24