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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2008, 13:08   #1
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
Восклицание паскаль динамич. списки...помогите кто чем может)

Программа сортирует двусвязный список по неубыванию...
Для этого я сначала нахожу максимальный элемент,затем ставлю его на первое место,затем нахожу максимальный элемент среди остальных элементов и ставлю его перед предыдущим максимальным элементом...и так до тех пор, пока не отсортируется список...
ПРИМЕР:
исходный список: 1 5 4 6 8
1 проход:8 1 5 4 6
2 проход:6 8 1 5 4
3 проход:5 6 8 1 4
4 проход:4 5 6 8 1
5 проход:1 4 5 6 8

мои наработки:
program L02;
uses crt;

type
PList = ^TList;
TList = record
a: integer;
pred,next : PList;
end;
var head,max: PList;
{Процедура создания списка}
procedure MakeList(Var head:PList);
var
p,q : PList;
n,i : integer;
begin
writeln('Введите количество элементов*');
readln(n);
randomize;
{Формирование списка*}
new(head); {Сторож - головной элемент}
head^.next:=nil;
head^.pred:=nil;
p:=head;
for I:=1 to n do
begin
new(q);
q^.a:=random(10)-4;
q^.pred:=p;
q^.next:=nil;
p^.next:=q;
p:=q;
end;
end;

{Процедура выводит список на экран}
procedure PrintList (var head : PList);
var p:PList;
begin
{Вывод списка на экран}
p:=head^.next;
while p<>nil do
begin
write(p^.a:6);
p:=p^.next;
end;
writeln;
end;

{Процедура сортировки списка*}
procedure Sort(var head:PList);
var p,q,h,max:PList;
begin {Нахождение максимального элемента*}
p:=head^.next;
max:=head;
while p<>nil do
begin
while p<>nil do
begin
if p^.a > max^.a then
begin
max:=p;
p:=p^.next;
end
else
p:=p^.next;
end;
{Переброс ссылок}
max^.pred^.next:=max^.next;
max^.next^.pred:=max^.pred;

max^.next:=head^.next;
max^.pred:=head;

head^.next^.pred:=max;
head^.next:=max;

p:=max^.next;
end;
end;

{Начало программы}
begin
clrscr;
MakeList(head);
writeln('Исходный список');
PrintList(head);
Sort(head);
writeln;
writeln('Отсортированный список');
PrintList(head);
readln;
end.

максимальный элемент находится корректно,а дальше идёт какое-то зацикливание...исправьте, пожалуйста код,если сможете...
Никита35 вне форума Ответить с цитированием
Старый 08.05.2008, 13:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты о сортировке пузырьком слышал что-нибудь?
Тут на форуме уже обсуждалась такая сортировка, советую проштудировать поиском.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.05.2008, 13:32   #3
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Всё это понятно,если бы так было можно-я бы воспользовался пузырьком...Проблема в том,что сортировать нужно именно таким методом,как у меня в алгоритме...(
Никита35 вне форума Ответить с цитированием
Старый 08.05.2008, 16:07   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Здравствуйте, Никита. Уже пятая тема об одном и том-же. В этом Вашем варианте "наработок" уже есть хоть что-то.
Давайте как-то уже разбирайтесь с этим вопросом. Мы то напишем, но даст ли это Вам хоть что-то ?

Вот сортировка двухсвязного списка тем методом, который Вы предложили
Код:
procedure Sort(var head:PList);
var p,p1,mp:PList;
begin
   p1 := head^.next;
   head^.next := nil; // отрываем список
   while p1 <> nil do begin
      // Поиск максимального элемента
      p := p1; mp := p;
      while p <> nil do begin
         if p^.a > mp^.a then mp := p;
         p := p^.next;
      end;
      // mp - максимальный элемент
      // Удаляем его из списка
      // Ссылки назад не восстанавливаем, т.к. они не нужны для поиска
      if mp = p1
      then p1 := mp^.next
      else begin
         mp^.pred^.next := mp^.next;
         if mp^.next <> nil
         then mp^.next^.pred := mp^.pred
      end;

      // помещаем его в голову списка
      mp^.pred := head;
      mp^.next := head^.next;
      if head^.next <> nil then head^.next^.pred := mp;
      head^.next := mp;
   end;
end;
Вот сортировка односвязного списка:
Код:
procedure sortList(head:PList);
var p1, p2, pm, lpm, lp, p : PList;
begin
   p1 := head.next;
   p2 := head;
   while p1 <> nil do begin
      // Поиск минимального элемента
      pm := p1; lpm := nil; p := p1; lp := nil;
      while p <> nil do begin
         if p.a <= pm.a then begin
            pm := p;
            lpm := lp;  // Запоминаем предыдущий
         end;
         lp := p;
         p := p.next;
      end;
      // Минимальный элемент убираем из списка
      if lpm = nil
      then p1 := pm.next
      else lpm.next := pm.next;
      // и помещаем в новый список
      p2.next := pm;
      p2 := p2.next;
      p2.next := nil;
   end;
end;
Код:
// А вот две головы для двух списков (это уже для слияния)
var head1, head2:PList;
begin
   randomize;
   MakeList(head1);
   MakeList(head2);
   WriteList(head1);
   WriteList(head2);
   SortList(head1);
   SortList(head2);
   WriteList(head1);
   WriteList(head2);
   readln;
PS. - написано на Delphi. В Pascal проставьте где нужно символы ^.
Следующий свой вопрос о списках задавайте здесь. Не нужно плодить темы. Неплохо было-бы заключать код в тэги CODE.
alexBlack вне форума Ответить с цитированием
Старый 08.05.2008, 21:58   #5
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Спасибо за сортировку!!!
Но теперь проблема в том, что не смотря на то,какие значения вводишь в количество элементов обоих списков,они выводятся совершенно одинаковые...
Никита35 вне форума Ответить с цитированием
Старый 08.05.2008, 22:03   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

randomize; нужно ставить не в MakeList, а один раз и до вызовов MakeList. Посмотрите в примере выше.
alexBlack вне форума Ответить с цитированием
Старый 08.05.2008, 22:16   #7
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

все равно...(((может,мой код выслать?
Никита35 вне форума Ответить с цитированием
Старый 08.05.2008, 22:20   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Давайте, посмотрим
alexBlack вне форума Ответить с цитированием
Старый 08.05.2008, 22:25   #9
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

program L02;
uses crt;

type
PList = ^TList;
TList = record
a: integer;
pred,next : PList;
end;
var head,head1,head2: PList;


procedure MakeList(Var head:PList);
var
p,q : PList;
n,i : integer;
begin
writeln('Введите количество элементов списка*:');
readln(n);

new(p);
head^.next:=nil;
head^.pred:=nil;
p:=head;
for I:=1 to n do
begin
new(q);
q^.a:=random(10)-4;
q^.pred:=p;
q^.next:=nil;
p^.next:=q;
p:=q;
end;
end;


procedure PrintList (var head: PList);
var p:PList;
begin
{‚лў®¤ бЇЁбЄ* ** нЄа**}
p:=head^.next;
while p<>nil do
begin
write(p^.a:6);
p:=p^.next;
end;
writeln;
end;


procedure Sort(var head:PList);
var p,p1,mp:PList;
begin
p1:=head^.next;
head^.next:=nil;
while p1<>nil do
begin
p:=p1;
mp:=p;
while p<>nil do
begin
if p^.a > mp^.a then
mp:=p;
p:=p^.next;
end;

if mp=p1 then
p1:=mp^.next
else
begin
mp^.pred^.next:=mp^.next;
if mp^.next<>nil then
mp^.next^.pred:=mp^.pred;
end;

mp^.pred:=head;
mp^.next:=head^.next;
if head^.next<>nil then
head^.next^.pred:=mp;
head^.next:=mp;
end;
end;


begin
clrscr;
randomize;
MakeList(head1);
MakeList(head2);
writeln('Данный список:');
PrintList(head1);
PrintList(head2);
writeln;
writeln('отсортированный список:');
Sort(head1);
Sort(head2);
PrintList(head1);
PrintList(head2);
readln;
end.
Никита35 вне форума Ответить с цитированием
Старый 08.05.2008, 22:35   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Издеваетесь ?
"они выводятся совершенно одинаковые" - они совершенно одинаково НЕ выводятся из того, что в makeList Вы не инициализировали head.
Исправляйте:

Код:
type
   PList = ^TList;
   TList = record
      a: integer;
      pred,next : PList;
   end;

var head1,head2: PList;

procedure MakeList(Var head:PList);
var p,q : PList;
    n,i : integer;
begin
  writeln('Введите количество элементов списка*:');
  readln(n);
  new(head);   { ВОТ ЗДЕСЬ БЫЛА ОШИБКА -------------------- } 
  head^.next:=nil;
  head^.pred:=nil;
  p:=head;
  for I:=1 to n do begin
     new(q);
     q^.a:=random(10)-4;
     q^.pred:=p;
     q^.next:=nil;
     p^.next:=q;
     p:=q;
  end;
end;


procedure PrintList (var head: PList);
var p:PList;
begin
   p:=head^.next;
   while p<>nil do begin
     write(p^.a:6);
     p:=p^.next;
   end;
   writeln;
end;


procedure Sort(var head:PList);
var p,p1,mp:PList;
begin
   p1:=head^.next;
   head^.next:=nil;
   while p1<>nil do begin
     p:=p1;
     mp:=p;
     while p<>nil do begin
        if p^.a > mp^.a then mp:=p;
        p:=p^.next;
     end;

     if mp=p1
     then p1:=mp^.next
     else begin
        mp^.pred^.next:=mp^.next;
        if mp^.next<>nil then
        mp^.next^.pred:=mp^.pred;
     end;
     mp^.pred:=head;
     mp^.next:=head^.next;
     if head^.next<>nil
     then head^.next^.pred:=mp;
     head^.next:=mp;
   end;
end;


begin
   randomize;
   MakeList(head1);
   MakeList(head2);
   writeln('Данный список:');
   PrintList(head1);
   PrintList(head2);
   writeln;
   writeln('отсортированный список:');
   Sort(head1);
   Sort(head2);
   PrintList(head1);
   PrintList(head2);
   readln;
end.
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно,пожалуйста...паскаль динамич. списки Никита35 Помощь студентам 2 07.05.2008 22:48
Списки. Паскаль Demyrg Помощь студентам 2 10.04.2008 08:20
Паскаль. Динамич массивы ProPaL Помощь студентам 6 25.03.2008 09:43
Помогите, кто чем может. (Паскаль) KORT Помощь студентам 8 03.11.2007 13:26
Паскаль. Списки Freem Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2007 14:22