Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
RIONOMARU
0 / 0 / 3
Регистрация: 08.12.2011
Сообщений: 24
#1

Операции по редактированию динамического списка, отсортированного по фамилии - Delphi

01.04.2012, 16:25. Просмотров 907. Ответов 3
Метки нет (Все метки)

Из сформированого списка, упорядоченного по полю Фамилия . Данные вводятся в поля редактирования (Edit1 и Edit2) и нажатием кнопки Добавить (Button1) добавляются в список таким образом, что список всегда упорядочен по полю Фамилия. Вывод данных производится нажатием кнопки Список. (Button2). Удаление узла из списка производится нажатием кнопки Удалить (Button3). Удаление узла из динамического списка.
Имеется код ну он почему-то не хочет работать:
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
unit dlist3_;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
{$R *.DFM}
 
type
  TPStudent=^TStudent; //указатель на тип TStudent
 
  TStudent = record
        f_name:string[20];  // фамилия
    l_name:string[20];  // имя
    next: TPStudent;    // следующий элемент списка
  end;
 
var
  head: TPStudent;  // начало (голова) списка
 
procedure TForm1.Button1Click(Sender: TObject);
var
   node: TPStudent;  // новый узел списка
   curr: TPStudent;  // текущий узел списка
   pre:  TPStudent;  // предыдущий, относительно curr, узел
begin
   new(node); // создание нового элемента списка
   node^.f_name:=Edit1.Text;
   node^.l_name:=Edit2.Text;
   // добавление узла в список
   // сначала найдем подходящее место в списке для узла
   curr:=head;
   pre:=NIL;
   { Внимание!
     если приведенное ниже условие заменить
     на (node.f_name>curr^.f_name)and(curr<>NIL)
     то при добавлении первого узла возникает ошибка времени
     выполнения, так как curr = NIL и, следовательно,
     переменной curr.^name нет!
     В используемом варианте условия ошибка не возникает, так как
     сначала проверяется условие (curr <> NIL), значение которого
     FALSE и второе условие в этом случае не проверяется.
   }
   while (curr <> NIL)and(node.f_name > curr^.f_name)  do
   begin
     // введенное значение больше текущего
     pre:= curr;
     curr:=curr^.next; // к следующему узлу
   end;
   if pre = NIL
     then
        begin
          // новый узел в начало списка
          node^.next:=head;
      head:=node;
        end
     else
        begin
          // новый узел после pre, перед curr
      node^.next:=pre^.next;
          pre^.next:=node;
        end;
 
   Edit1.text:='';
   Edit2.text:='';
   Edit1.SetFocus;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
 curr: TPStudent;  // текущий элемент списка
 n:integer; // длина (кол-во элементов) списка
 st:string; // строковое представление списка
begin
 n:=0;
 st:='';
 curr:=head;
 while curr <> NIL do
    begin
      n:=n+1;
      st:=st+curr^.f_name+' '+curr^.l_name+#13;
      curr:=curr^.next;
    end;
 if n <> 0
    then ShowMessage('Список:'+#13+st)
    else ShowMessage('В списке нет элементов.');
end;
 
procedure TForm1.FormActivate(Sender: TObject);
begin
     head:=NIL;
end;
 
// щелчок на кнопке Удалить
procedure TForm1.Button3Click(Sender: TObject);
var
  curr:TPStudent; // текущий, проверяемый узел
  pre: TPStudent; // предыдущий узел
  found:boolean;  // TRUE - узел, который надо удалить, есть в списке
 
begin
  if head = NIL then
     begin
        MessageDlg('Список пустой!',mtError,[mbOk],0);
        Exit;
     end;
  curr:=head;   // текущий узел - первый узел
  pre:=NIL;     // предыдущего узла нет
  found:=FALSE;
 
  // найти узел, который надо удалить
  while (curr <> NIL) and (not found) do
      begin
          if (curr^.f_name = Edit1.Text) and (curr^.l_name = Edit2.Text)
            then found:=TRUE // нужный узел найден
            else  // к следующему узлу
               begin
                 pre:=curr;
                 curr:=curr^.next;
               end;
      end;
      if found then
         begin
            // нужный узел найден
            if MessageDlg('Узел будет удален из списка!',
                           mtWarning,[mbOk,mbCancel],0) <> mrYes
               then Exit;
 
            // удаляем узел
            if pre = NIL
               then  head:=curr^.next      // удаляем первый узел списка
               else pre^.next:=curr.next;
             Dispose(curr);
             MessageDlg('Узел' + #13 +
                      'Имя:'+Edit1.Text + #13 +
                      'Фамилия:' + Edit2.Text + #13 +
                      'удален из списка.',
                      mtInformation,[mbOk],0);
         end
      else // узла, который надо удалить, в списке нет
           MessageDlg('Узел' + #13 +
                      'Имя:' + Edit1.Text + #13 +
                      'Фамилия:' + Edit2.Text + #13 +
                      'в списке не найден.',
                      mtError,[mbOk],0);
      Edit1.Text:='';
      Edit1.Text:='';
      Edit1.SetFocus;
end;
 
 
end.
 Комментарий модератора 
Теги кода добавлены модератором. По правилам форума, код должен быть оформлен соответствующими тегами. Для оформления кода Delphi следует выделить этот код и на панели редактирования сообщения нажать кнопку: "DELPHI".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 16:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Операции по редактированию динамического списка, отсортированного по фамилии (Delphi):

Сортировка динамического списка
Здравствуйте. Помогите пожалуйста написать сортировку динамического списка....

Освобождение динамического списка
Здравствуйте. Пытаюсь освободить список. Вот код: procedure DispEl(); var ...

Создание динамического списка
Я в Дельфи уже почти всё изучил, остались только динамические списки. Я их...

Удаление нескольких элементов из динамического списка
Здравствуйте, у меня проблема с динамическим массивом. Дело в том, что мне...

IMAP получения отсортированного списка писем
Всем привет. Стоит такая задача. Надо получить ограниченный список (к примеру,...

Создание пилообразной последовательности из отсортированного списка
Имеется некий список, допустим . Помогите пожалуйста написать алгоритм,...

3
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 17:38 #2
RIONOMARU, код полностью рабочий. Он только не удаляет из-за предупреждения. Исправил, вроде так работает.
Здесь:
Delphi
1
2
3
if MessageDlg('Узел будет удален из списка!',
mtWarning,[mbOk,mbCancel],0) <> mrYes
then Exit;
Исправить на:
Delphi
1
2
3
if MessageDlg('Узел будет удален из списка!',
mtWarning,[mbYes,mbCancel],0) <> mrYes
then Exit;
0
RIONOMARU
0 / 0 / 3
Регистрация: 08.12.2011
Сообщений: 24
02.04.2012, 08:11  [ТС] #3
Все равно вылазиет ошибка при попытке удаления из списка
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
02.04.2012, 10:44 #4
Во-первых, какая ошибка? Во-вторых, какой delphi стоит?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 10:44
Привет! Вот еще темы с решениями:

Ошибка кодировки при выводе оригинального и отсортированного списка
Здравствуйте, уважаемые форумчане! Не могу понять, почему трабла с кодировкой?...

Методом вставки упорядочить список по возрастанию и удалить из отсортированного списка положительные элементы
создать односвязный линейный список чисел. Методом вставки упорядочить список...

Вывод в текстовый файл списка файлов, отсортированного по дате последнего изменения (начиная с самого старого)
Хотелось бы узнать, какой командой можно выполнить данную операцию. Желательно...

Отбор записей динамического списка по выбранному значению отбора в виде выпадающего списка
Здравствуйте, имеется справочник с реквизитами: ДатаНачала, Продолжительность,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru