0 / 0 / 0
Регистрация: 25.04.2013
Сообщений: 22
1

Сортировка списка очереди

25.04.2013, 20:04. Показов 1098. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача заключается в том, что есть динамический список и нужно его отсортировать по возрастанию, но при этом нужно переставлять не значения, а сами ячейки памяти в списке.
Вот пытался сделать, но не работает.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
program Sort;
 
uses CRT;
 
Type pelem=^elem;
     elem=record
          data:integer;
          next:pelem;
        end;
 
procedure Vvod(var beg:pelem);
var p,kon:pelem;
    dat:integer;
begin
    beg:=nil;
    kon:=nil;
    read(dat);
    if dat=0 then
    else
    new(beg);
    kon:=beg;
    beg^.data:=dat;
    kon^.next:=nil;
    read(dat);
    While dat <> 0 do
    begin
        new(p);
        kon^.next:=p; kon:=p;
        p^.data:=dat;
        p^.next:=nil;
       Read(dat);
     end;
   readln;
end;
 
procedure Vyvod(var p:pelem);
var pn:pelem;
begin
    pn:=p;
       while pn<>nil do
       begin
          write(pn^.data:4);
          pn:=pn^.next;
       end;
end;
 
procedure Sorti(var z:pelem);
var zn,n,k,kn,e,l:pelem;
i,c:integer;
begin
    If z<>nil then
       begin
          c:=1;
          e:=z;
          While e^.next <> nil do
             begin
                e:=e^.next;
                c:=c+1
             end;
 
       If z^.next<>nil then
       For i:=0 to c do
          begin
             zn:=z^.next;
             if z^.data > zn^.data then
                begin
                   k:=z;
                   kn:=zn;
                   k^.next:=kn^.next;
                   kn^.next:=z;
                   z:=kn;
                   zn:=k;
                   l:=z;
                 end;
                 n:=z;
                 If zn^.next <> nil then
                    begin
                       z:=z^.next;
                       zn:=zn^.next;
                          While zn<>nil do
                             If z^.data > zn^.data then
                             begin
                                k:=z;
                                kn:=zn;
                                k^.next:=kn^.next;
                                kn^.next:=z;
                                z:=kn;
                                zn:=k;
                                l^.next:=z;
                                l:=l^.next;
                                z:=z^.next;
                                zn:=zn^.next;
                             end;
 
                    end;
          end;
       end;
z:=n;
end;
 
var d:pelem;
 
Begin
CLRSCR;
    d:=nil;
    Vvod(d);
    Sorti(d);
    Writeln('============================');
    Vyvod(d);
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2013, 20:04
Ответы с готовыми решениями:

Подключение по очереди из списка ip
Всем, привет. Есть программа-сервер выполняющая в cmd команды поступающие от...

Разделение двунаправленной очереди на 2 списка
Здравствуйте, как переделать функцию del_el2, чтобы место удаления отрицательных элементов функция...

Сортировка очереди
struct element { int m; int n; element* next; element(int a, int b) {m=a;...

Сортировка очереди
У меня есть функция сортировки очереди по возрастанию, а нужно сделать по убыванию. Помогите...

1
438 / 367 / 132
Регистрация: 09.09.2011
Сообщений: 1,334
26.04.2013, 12:12 2
как то так:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
program sorting_list;
 
{Решаем задачу с [url]https://www.cyberforum.ru/free-pascal/thread848624.html[/url]
по заданию:
есть динамический список и нужно его отсортировать по возрастанию,
но при этом нужно переставлять не значения, а сами ячейки памяти в списке.}
{$mode objfpc}{$H+}
 
uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  Classes { you can add units after this };
 
type
  pelem = ^elem;
 
  elem = record
    Data: integer;
    Next: pelem;
  end;
 
  procedure Vvod(var beg: pelem);
  var
    p, kon: pelem;
    dat: integer;
  begin
    beg := nil;
    kon := nil;
    Read(dat);
    if dat = 0 then
    else
      new(beg);
    kon := beg;
    beg^.Data := dat;
    kon^.Next := nil;
    Read(dat);
    while dat <> 0 do
    begin
      new(p);
      kon^.Next := p;
      kon := p;
      p^.Data := dat;
      p^.Next := nil;
      Read(dat);
    end;
    readln;
  end;
 
  procedure Vyvod(var p: pelem);
  var
    pn: pelem;
  begin
    pn := p;
    while pn <> nil do
    begin
      Write(pn^.Data: 4);
      pn := pn^.Next;
    end;
  end;
 
 
  //сортировка выбором O(n)= n^2
  procedure srt(var z: pelem);
  //функция сравнения элементов
  function isBigger(var el1, el2: pelem): boolean;
  begin
    result:= el1^.Data > el2^.Data;
  end;
  //процедура обмена элементами
  procedure exchangeElm(var el1, el2: pelem);
  var
    tElem: pelem;
  begin
    tElem^:= el1^;
    el1^:= el2^;
    el1^.Next:= tElem^.Next;
    tElem^.Next:= el2^.Next;
    el2^:=tElem^;
  end;
 
  var
    cur: pelem; //указатель на 1-ый не отсортированный элемент
    min: pelem; //указатель на минимальный эл. в хвосте
    test: pelem;//тестируемый эл. в хвосте
  begin
    if not Assigned(z) then exit;
    cur:= z;
 
    while  assigned(cur^.Next) do begin
      min:= cur;
      test:= cur;
 
      //поиск минимума в хвосте
      while true do begin
        if isBigger(min, test) then
            min:= test;
        if not Assigned(test^.Next) then
            break;
        test:= test^.Next;
      end;
 
      if isBigger(cur, min) then
        exchangeElm(cur, min);
      cur:= cur^.Next;
    end;
  end;
 
var
  d: pelem;
 
begin
  //CLRSCR;
  d := nil;
  Vvod(d);
  srt(d);
  Writeln('============================');
  Vyvod(d);
  readln;
end.


и надо переработать процедуру ввода - если ввести 0 то падает по AV.
0
26.04.2013, 12:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2013, 12:12
Помогаю со студенческими работами здесь

Сортировка очереди
Всем привет. Есть задание: В справочной автовокзала хранится расписание движения автобусов. Для...

Реализация стека и очереди на основе списка
1. Создать базовый класс CList (линейный однонаправленный cписок) с полями: указате-ли на...

Реализация очереди на основе связанного списка
Реализация очереди на основе связанного списка в строках хэдэра tmp-&gt;ch.name = ch1.name; ...

Реализовать заполнение списка или очереди
Доброго времени суток! Надо реализовать на делфи заполнения списка или очереди (что удобней),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru