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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2016, 14:36   #1
Екатерина57
Пользователь
 
Регистрация: 11.10.2015
Сообщений: 63
Печаль Как поменять элементы в односвязном списке

Мне надо поменять местами элементы max и min,я запуталась, как это надо делать,если есть возможность,помогите.Так же я хотела объединить процедуру нахождения min и max,но что то тоже запуталась

Код:
program Swap; 

type 
 plist = ^tlist; 
 tlist = record 
 data : integer; 
 next : plist; 
 end; 

var 
 lst, start : plist; 
 i : integer; 

procedure addToList(d : integer); 
var 
 node : plist; 
begin 
 New (node); 
 node^.data := d; 
 node^.next := nil; 

 if start <> nil then 
 begin 
 lst := start; 

 while lst^.next <> nil do 
 lst := lst^.next; 
 lst^.next := node; 
 end 
 else 
 start := node; 
 lst := node 
 end; 

procedure printList(); 
begin 
if start <> nil then 
 begin 
 lst := start; 
 while lst <> nil do 
 begin 
 writeln(lst^.data); 
 lst := lst^.next; 
 end; 
 end; 
 writeln('End of List'); 
end; 

procedure Search(); 
 var min : integer; 
 prevNode, swapNode: plist; 
begin 
if start <> nil then 
 begin 
 lst := start; 
 min := lst^.data; 
 prevNode := nil; 
 swapNode := nil; 
 while lst <> nil do 
 begin 
 if lst^.data < min then 
 begin 
 min := lst^.data; 
 swapNode := prevNode; 
 end; 
 prevNode := lst; 
 lst := lst^.next; 
 end;
 lst := start;   

end; 

begin 
 addToList(8); 
 addToList(7); 
 addToList(14); 
 addToList(1); 
 addToList(55); 
 addToList(51); 
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 17.06.2016 в 15:07.
Екатерина57 вне форума Ответить с цитированием
Старый 17.06.2016, 15:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
function GetPrev(nd: Plist): Plist;
begin
  result:=start;

  while result^.Next<>nd do 
    result:=result^.next;
end;

procedure Swap(nd1, nd2: PList);
var
  p1, n1: Plist; //предыдущие эл-ты 
  p2, n2: PList; //последующие эл-ты
begin
//получаем данные о предыдущих и последующих ДЛЯ обоих
  p1:=GetPrev(nd1);
  n1:=nd1^.Next;
  p2:=GetPrev(nd2);
  n2:=nd2^.Next;

// и устанавливаем 
  p1^.next:=nd2; //ссылка первОГО предыдущЕГО на второй  
  nd2^.Next:=n1; //ссылка второго(который ДОЛЖЕН стать первым) на последующий первого
// ТЕПЕРЬ он встроен на нужное место

// аналогично
  p2^.Next:=nd1; //ссылка второго предыдущЕГО на ПЕРВЫЙ
  nd1^.Next:=n2; //ссылка первого(который будет вторым) на последующий второго
// и он встроен
end;
Код:
function MinX: PList;
var
  r: Plist;
begin
  result:=nil;
  r:=start;
  while r<>nil do begin
    if result=nil then result:=r
    else if result^.data>r^.Data then result:=r;
    r:=r^.Next;
  end;
end;
Код:
procedure MinMax(var min, max: Plist);
var
  r: PList;
begin
  min:=nil;
  max:=nil;
  r:=start;
  while r<>nil do begin
    if max=nil then max:=r
    else if max^.Data<r^.Data then max:=r;
    
    if min=nil then min:=r
    else if min^.Data>r^.Data then min:=r;
    
    r:=r^.Next;
 end;   
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.06.2016 в 15:18.
evg_m вне форума Ответить с цитированием
Старый 17.06.2016, 15:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так устроит?
Код:
program Swap;

type
 plist = ^tlist;
 tlist = record
   data : integer;
   next : plist;
 end;


procedure addToList(var Start : plist; d : integer);
var
 lst, node : plist;
begin
 New (node);
 node^.data := d;
 node^.next := nil;

 if start <> nil then
 begin
    lst := start;
    while lst^.next <> nil do
       lst := lst^.next;
    lst^.next := node;
 end
 else
   start := node;
 end;

procedure printList(Start : plist);
var
 lst : plist;
begin
 lst := start;
 while lst <> nil do
 begin
   write(lst^.data,' ');
   lst := lst^.next;
 end;
 writeln('End of List');
end;

procedure SearchMinMax(Start : plist; var min, max : plist);
var
 lst : plist;
begin
 lst := start;
 
 min := lst; max := lst;
 while lst <> nil do
 begin
   if lst^.data<min^.data then min:=lst;
   if lst^.data>max^.data then max:=lst;
   lst := lst^.next;
 end;
end;

procedure SwapElements(Start, L1, L2 : plist);
var tmp : integer; {переменная того же типа,что и поле data в tlist}
begin
  {для обмена поменяем местами информационные части L1^.data <--> L2^.data}
  if (L1<>nil) and (L2<>nil) and (L1<>L2) then begin
    tmp := L1^.data;
    L1^.data := L2^.data;
    L2^.data := tmp
  end;
end;


var
  Head : plist;
  minElement, maxElement : plist;
begin
 Head := nil;
 addToList(Head,12);
 addToList(Head,8);
 addToList(Head,1);
 addToList(Head,14);
 addToList(Head,41);
 addToList(Head,55);
 addToList(Head,51);

 {вывести список на экран}
 printList(Head);
 
 {поиск минимального и максимального элементов списка}
 SearchMinMax(Head, minElement, maxElement);
 
 if minElement=nil then WriteLn('В списке не найдено минимальное значение!')
 else WriteLn('Минимальное значение = ',minElement^.data);
 if maxElement=nil then WriteLn('В списке не найдено максимальное значение!')
 else WriteLn('Максимальное значение = ',maxElement^.data);
 
 {обменять местами два элемента списка}
 SwapElements(Head, minElement, maxElement);

 {вывести список на экран}
 printList(Head);

end.


p.s.
evg_m, извините, не увидел ваш код...
пусть тогда будет два варианта решения. Тем более, что эти решения - разные!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.06.2016, 15:59   #4
Екатерина57
Пользователь
 
Регистрация: 11.10.2015
Сообщений: 63
По умолчанию

Спасибо вам огромное
Екатерина57 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
исправить код в односвязном списке svetik290895 Помощь студентам 0 13.05.2015 19:44
Удаление узлов в односвязном списке Niklitel Помощь студентам 1 01.03.2014 14:41
Последовательный поиск в односвязном списке vo0vka Помощь студентам 2 01.12.2012 23:49
Очистка памяти в односвязном списке Sigwey Помощь студентам 0 28.12.2010 17:02
Поиск в односвязном списке DOJ Общие вопросы C/C++ 6 04.10.2009 13:34