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

Отсортировать элементы списка по возрастанию (дописать программу)

05.06.2014, 20:12. Показов 2199. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помочь мне с написанием программы.
Задание звучит так:
Отсортировать элементы списка по возрастанию. Та часть кода, где у меня происходит сортировка не подходит(хоть и сортирует правильно). Нужно сделать сортировку тем же методом, как и добавление чисел в список.
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 type
 PElem=^TElem;
 TElem= record          {Описание элемента }
   Info: string[10];
   next: PElem;
  end;
var
  Form1: TForm1;
  p, head, q:PElem;
  x:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Memo1.Lines.Clear;
new (p);   {создание нового элемента}
p^.Info:=Edit1.Text;
if head=nil then
  begin
  head:=p;
  p^.next:=Nil;   {Этот элемент последний. Он не ссылается на другие элементы}
  end
else
  begin
   p^.next:=head;  {Указатель предыдущего  элемента даёт адрес  последующего элемента}
   head:=p;
  end;
 
 While P <> Nil Do  {вывод односвязного списка в Memo1}
 Begin
  Form1.Memo1.Lines.Add(p^.Info);
  P:=P^.next;
 End;
 
end;
 
         function Sort(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result:=Round(StrToFloat(List[Index1])-StrToFloat(List[Index2]));
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
head:=nil;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
  tmp:TStringList;
begin
  tmp:=TStringList.Create;
  tmp.Assign(Memo1.Lines);
  tmp.CustomSort(Sort);
  Memo1.Lines.Assign(tmp);
  FreeAndNil(tmp);
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2014, 20:12
Ответы с готовыми решениями:

Выкинуть все четные элементы. Отсортировать оставшиеся элементы по возрастанию
В одномерном массиве нужно выкинуть все четные элементы,а оставшиеся элементы отсортировать по...

Отсортировать положительные элементы массива по возрастанию, отрицательные элементы оставить на своих местах
Дан массив А,заполненный положительными и отрицательными целыми числами.необходимо отсортировать...

Отсортировать положительные элементы матрицы по возрастанию, оставив на своих местах отрицательные элементы.
вводится массив 6*6.отсортировать положительные элементы массива по возрастанию,оставив на своих...

Найти максимальный элемент. Отсортировать предшествующие ему элементы по убыванию, а следующие за ним элементы по возрастанию.
Дан одномерный массив целых чисел, содержащий 20 различных элементов. Найти максимальный элемент....

1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.06.2014, 01:22 2
На форму надо положить:
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Для кнопки Button1 создать обработчик события OnClick. Код реализации модуля оформить так, как показано ниже.
Элементы списка - целые числа - задаются пользователем в Memo1. Каждый элемент должен быть записан в Memo1 на отдельной строке. По нажатию на кнопку Button1 происходит следующее:
- по содержимому Memo1.Lines создаётся динамический список;
- список распечатывается в Memo2;
- затем список сортируется по возрастанию;
- и опять распечатывается в Memo2;
- после этого память, выделенная для элементов списка - освобождается.
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
implementation
 
{$R *.dfm}
 
type
  {Тип основных данных.}
  TData = Integer;
  {Тип, описывающий указатель на элемент.}
  TPElem = ^TElem;
  {Тип, описывающий элемент списка.}
  TElem = record
    Data : TData;
    PNext : TPElem; {Указатель на следующий элемент.}
  end;
  {Тип, описывающий список.}
  TDList = record
    PFirst, PLast : TPElem; {Указатели на первый и на последний элементы списка.}
  end;
 
{Процедуры для работы со списком.}
 
{Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
только в отношении пустого списка. Иначе будут утечки памяти.}
procedure Init(var aL : TDList);
begin
  aL.PFirst := nil;
  aL.PLast := nil;
end;
 
{Освобождение памяти, занятой для элементов списка и инициализация.}
procedure LFree(var aL : TDList);
var
  P, PDel : TPElem;
begin
  P := aL.PFirst; {Указатель на первый элемент списка.}
  while P <> nil do
  begin
    PDel := P; {Запоминаем указатель на текущий элемент.}
    P := P^.PNext; {Получаем указатель на следующий элемент.}
    Dispose(PDel); {Освобождаем память, занятую текущим элементом списка.}
  end;
  Init(aL);
end;
 
{Добавление элемента в конец списка.}
procedure Add(var aL : TDList; const aData : TData);
var
  P : TPElem;
begin
  New(P); {Выделяем паямять для элемента.}
  P^.Data := aData; {Записываем данные.}
  {Так как добавляемый элемент будет последним в списке, то указатель
  на следующий элемент делаем равным NIL.}
  P^.PNext := nil;
  {Если список пуст, то новый элемент станет первым элементом списка.}
  if aL.PFirst = nil then
    aL.PFirst := P
  {Если список непустой, то новый элемент прикрепляем к последнему элементу списка.}
  else
    aL.PLast^.PNext := P;
  {Новый элемент становится последним элементом списка.}
  aL.PLast := P;
end;
 
{Пузырьковая сортировка по возрастанию.}
procedure SortDesc(const aL : TDList);
var
  P, PEnd : TPElem;
  Data : TData;
  {F - флаг для пузырьковой сортировки. Показывает - была ли хотябы одна
  перестановка элементов на текущей итерации (на текущем проходе области сортировки).}
  F : Boolean;
begin
  {Если список пуст или содержит только один элемент, то выходим.}
  if aL.PFirst = aL.PLast then
    Exit;
 
  {Указатель на границу области сортировки. После прогона каждого пузырька
  граница области сортировки смещается на 1 элемент в сторону начала списка.}
  PEnd := aL.PLast;
  repeat
    F := False; {Начальное значение флага - перестановк не было.}
    P := aL.PFirst; {Указатель на начало области сортировки.}
    {Выполняем перебор, пока указатель не достиг конца области сортировки.
    Во время перебора обрабатываем пары элементов P^ и P^.Next^. Сравниваем
    их данные и, если требуется, выполняем перестановки.}
    while P <> PEnd do
    begin
      {Если данные элемента больше данных следующего элемента, то выполняем перестановку.}
      if P^.Data > P^.PNext^.Data then begin
        Data := P^.Data;
        P^.Data := P^.PNext^.Data;
        P^.PNext^.Data := Data;
        F := True; {Показываем, что произошла перестановка.}
      end;
      {Если обработана последняя пара (P^ и P^.Next^) в области сортировки, то
      смещаем границу области сортировки на 1 элемент влево.}
      if P^.PNext = PEnd then
        PEnd := P
      {Если это не последняя пара в области сортировки, то получаем указатель
      на следующий элемент списка.}
      else
        P := P^.PNext;
    end;
    {Если на текущей итерации не было ни одной перестановки, значит сортировка завершена.}
  until not F;
end;
 
{Распечатка списка.}
function ListToStr(const aL : TDList) : String;
var
  P : TPElem;
begin
  P := aL.PFirst; {Указатель на первый элемент списка.}
  if P <> nil then
  repeat
    {Если это не первый элемент, то в распечатке ставим перед ним запятую.}
    if P <> aL.PFirst then
      Result := Result + ', ';
    Result := Result + IntToStr(P^.Data); {Распечатываем данные текущего элемента.}
    P := P^.PNext; {Получаем указатель на следующий элемент.}
  until P = nil
  else
    Result := 'Список пуст.';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  L : TDList;
  i : Integer;
  S : String;
begin
  Init(L); //Начальная инициализация списка.
 
  {Читаем числа из Мемо и добавляем их в список.
  Предполагается, что каждое число в Мемо расположено на отдельной строке.}
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    S := Memo1.Lines[i];
    if S <> '' then
      Add(L, StrToInt(S));
  end;
 
  Memo2.Lines.Add('--------------------------------------------------');
  Memo2.Lines.Add('Составлен список:');
  Memo2.Lines.Add(ListToStr(L));
 
  SortDesc(L); //Сортировка списка по возрастанию.
 
  Memo2.Lines.Add('Список после сортировки:');
  Memo2.Lines.Add(ListToStr(L));
 
  LFree(L); //Особождение памяти, занятой для элементов списка.
end;
 
end.
0
06.06.2014, 01:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2014, 01:22
Помогаю со студенческими работами здесь

Найти минимальный элемент. Отсортировать предшествующие ему элементы по возрастанию, а следующие за ним элементы по убыванию
Дан одномерный массив целых чисел, содержащий 20 различных элементов. Найти минимальный элемент....

Найти максимальный элемент. Отсортировать предшествующие ему элементы по убыванию, а следующие за ним элементы по возрастанию.
Дан одномерный массив целых чисел, содержащий 20 различных элементов. Найти максимальный элемент....

Отсортировать список по возрастанию и сформировать два новых списка
Дан список, содержащий числовые данные. Отсортировать его по возрастанию и сформировать два новых...

Отсортировать первую половину списка по убыванию, вторую по возрастанию
Здравствуйте, форумчане. Есть структура: typedef struct list { int data; struct...


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

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

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