Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Динамический список 3

Delphi , Компоненты и Классы , Списки

Динамический список 3

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, которая реализует динамический список студентов с возможностью добавления, отображения и удаления студентов из списка.

Интерфейс Секция интерфейса объявляет несколько компонентов: TForm1, Label1 до Label3, Button1 до Button3, Edit1 и Edit2. Эти компоненты будут использоваться для взаимодействия с пользователем и отображения списка студентов.

Имплементация Секция имплементации определяет два типа:

  • TPStudent: указатель на запись, называемую TStudent.
  • TStudent: запись, содержащая три поля: f_ name, l_ name и next. Поля f_ name и l_ name хранят имя студента, а поле next - указатель на следующего студента в списке.

Также секция имплементации определяет несколько переменных:

  • head: указатель на первый студент в списке.
  • node: новый студент, который будет добавлен в список.
  • curr: текущий студент, который обрабатывается.
  • pre: предыдущий студент, относительно текущего.

Button1Click Процедура, вызываемая при клике кнопки "Добавить". Она создает новый студент с именем и фамилией, введенными пользователем в текстовых полях Edit1 и Edit2. Новый студент добавляется в список, который реализуется как связанный список. Список отсортирован по алфавиту по фамилии.

Button2Click Процедура, вызываемая при клике кнопки "Отобразить". Она отображает всех студентов в списке, с их именами и фамилиями, разделенными пробелами, на сообщении.

FormActivate Процедура, вызываемая при активации формы (т.е., когда она загружается впервые). Она инициализирует переменную head в значение nil, указывая, что список пуст.

Button3Click Процедура, вызываемая при клике кнопки "Удалить". Она находит студента с именем и фамилией, введенными пользователем в текстовых полях Edit1 и Edit2. Еслиsuch student exists, он удаляется из списка. Если не существует, отображается сообщение об ошибке.

Замечания

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

В целом, это код демонстрирует основные операции над динамическим списком студентов в Delphi.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 17:56:00/0.0042440891265869/0