Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Односвязный список, Обменять второй и последний элементы 
:(
    Опции темы
Grizzzli
Дата 14.12.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



Уважаемые программисты, помогите справиться с задачей

Нужно поменять второй и последний элементы односвязного линейного списка местами. Есть код, меняющий наоборот первый и предпоследний элементы списка! ЧТо нужно исправить?


Код


program list;
uses crt;
type u=^zap;
     zap=record
           inf:integer;
           ukz:u;
         end;
var PSP:u;
    ch:char;

procedure create_list(var PSP:U);
var Q,
    P: U;
    Ch: Char;
Begin
     New(Q);
     Writeln('VVedute informatsionnoe pole elementa');
     Readln(Q^.INF);
     PSP:=Q;
     Writeln('Prodolzhit vvod& y/n');
     Ch:=ReadKey;
     while Ch in ['y','Y'] do
           Begin
                New(P);
                Writeln('VVedite informatsionnoe pole elementa');
                Readln(P^.INF);
                Q^.UKZ:=P;
                Q:=P;
                Writeln('Prodolzhit vvod& y/n');
                Ch:=ReadKey;
           End;
     Q^.UKZ:=Nil;
End;

procedure print_list(PSP:U);
Var t:u;
Begin
     if PSP=nil then
        begin
             Writeln('Spisok pust');
             Readkey;
             Exit;
        end;
     Writeln('Soderzhimoe spiska');
     t:=PSP;
     while t<>nil do
                    begin
                         write(t^.inf,' --> ');
                         t:=t^.ukz;
                    end;
     Writeln('NIL');
     Writeln('Nazhmite lyubuyu klavishu..');
     Readkey;
End;

procedure destroy_list(var PSP:u);
var t:u;
Begin
     while PSP<>nil do
                      begin
                           t:=PSP;
                           PSP:=PSP^.ukz;
                           dispose(t);
                      end;
End;

procedure edit_list(var PSP:u);
var q,s,t:u;
Begin
     if (PSP=nil) or (PSP^.ukz=nil) or (PSP^.ukz^.ukz=nil) then
        begin
             Writeln('V spiske menshe treh elementov, zadanaya obrabotka nevozmozhna');
             print_list(PSP);
             Exit;
        end;
     q:=PSP;
     s:=PSP^.ukz;
     while s^.ukz^.ukz<> nil do
           begin
                q:=s;
                s:=s^.ukz;
           end;
     if q=PSP then 
        begin
             q^.ukz:=s^.ukz;
             s^.ukz:=q;
             PSP:=s;
             Writeln('Obmen 1-go i 2-go elementa vipolnen');
             Readkey;
             Exit;
        end;
     t:=PSP^.ukz;
     PSP^.ukz:=s^.ukz;
     s^.ukz:=t;
     q^.ukz:=PSP;
     PSP:=s;
     Writeln('Obmen 1-go i 2-go elementa vipolnen');
     Readkey;
End;

Begin
     PSP:=nil;
     repeat
           Clrscr;
           Writeln('1. Sozdat spisok');
           Writeln('2. Prosmotret spisok');
           Writeln('3. Pomenyat mestami perviy i predposlednij elementi spiska');
           Writeln('4. Udalit spisok');
           Writeln('-----------------------------------------------');
           Writeln('0. Vihod');
           Writeln;
           Writeln('Vash vibor: ');
           ch:=Readkey;
           Writeln(ch);
           Writeln;

           Case ch of
                     '1': begin psp:=nil; create_list(PSP); end;
                     '2': print_list(PSP);
                     '3': edit_list(PSP);
                     '4': begin destroy_list(PSP); Writeln('Spisok udalen!'); Readkey; end;
           end;
     until ch='0';
end.


M
Rrader
Модератор: Название темы должно отражать ее суть!

           

Это сообщение отредактировал(а) Rrader - 31.12.2009, 18:37
PM MAIL   Вверх
Hinidu
Дата 15.12.2009, 01:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.12.2009
Где: Калининград

Репутация: нет
Всего: нет



Думаю, в этой задаче, проще было бы поменять информационные поля, а не ссылки на элементы:
Код

var tmp: integer; p,p2: u;
p:=PSP;
p2:=PSP^.ukz;
while p2<>nil do
  begin
  p:=p2;
  p2:=p2^.ukz;
  end;
tmp:=PSP^.ukz^.inf;
PSP^.ukz^.inf:=p^.inf;
p^.inf:=tmp;

Если же прям очень надо поменять именно ссылки на элементы, то вот так:
Код

var tmp: integer; p,p2: u;
p:=PSP;
p2:=PSP^.ukz;
while p2<>nil do
  begin
  p:=p2;
  p2:=p2^.ukz;
  end;
p^.ukz:=PSP^.ukz;//за предпоследним следует второй
p2^.ukz:=PSP^.ukz^.ukz;//за последним третий
PSP^.ukz^.ukz:=nil;//второй стал последним
PSP^.ukz:=p2;//за первым последний

В обоих случаях, код нужно добавить в edit_list, после проверки длины списка

Это сообщение отредактировал(а) Hinidu - 15.12.2009, 01:28
PM MAIL ICQ   Вверх
Grizzzli
Дата 15.12.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



спасибо. Вот процедура рабочая, без ошибок.


Код


procedure edit_list(var PSP:u);
var p,p2:u;
Begin
     if (PSP=nil) or (PSP^.ukz=nil) or (PSP^.ukz^.ukz=nil) then
        begin
             Writeln('V spiske menshe treh elementov, zadanaya obrabotka nevozmozhna');
             print_list(PSP);
             Exit;
        end;
     p:=PSP;
     p2:=PSP^.ukz;
     while p2^.ukz<>nil do
           begin
                p:=p2;
                p2:=p2^.ukz;
           end;
    
p^.ukz:=PSP^.ukz;
p2^.ukz:=PSP^.ukz^.ukz;
PSP^.ukz^.ukz:=nil;
PSP^.ukz:=p2;
     Writeln('Obmen 1-go i 2-go elementa vipolnen');
     Readkey;
End;

PM MAIL   Вверх
eugenegrig
Дата 30.12.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.12.2009

Репутация: нет
Всего: нет



А как поменять местами второй и предпоследний элементы?? smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.5159 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.