Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 08.12.2011
Сообщений: 24

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

01.04.2012, 16:25. Показов 1565. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2012, 16:25
Ответы с готовыми решениями:

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

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

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

3
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
01.04.2012, 17:38
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
0 / 0 / 0
Регистрация: 08.12.2011
Сообщений: 24
02.04.2012, 08:11  [ТС]
Все равно вылазиет ошибка при попытке удаления из списка
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
02.04.2012, 10:44
Во-первых, какая ошибка? Во-вторых, какой delphi стоит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2012, 10:44
Помогаю со студенческими работами здесь

Бинарный поиск для отсортированного списка
Привет, возник вопрос по работе и написанию бинарного поиска, написал код. Первый вопрос для чего нужен int key, сам код вот public static...

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

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

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

Как связать звено элемента динамического списка с выбранным элементом из списка?
как связать звено элемента динамического списка с выбранным элементом из списка в коде? procedure TForm1.Edit2Change(Sender:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru