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

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

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

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

unit dlist2_;

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;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(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;

end.
Скачать весь проект

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

В главной форме (TForm1) есть четыре компонента: Label1, Label2, два текстовых поля (Edit1 и Edit2) и две кнопки (Button1 и Button2). Форма также имеет три процедуры:

  • Button1Click: добавляет новую запись о студенте в список.
  • Button2Click: отображает все записи о студентах в списке.
  • FormActivate: инициализирует динамический список при активации формы.

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

Программа использует реализацию связанного списка, где каждый узел представляет собой запись о студенте. Каждый узел имеет три поля: f_name (имя студента), l_name (фамилия студента) и next (указатель на следующий узел в списке). Переменная head указывает на начало списка.

Добавление новой записи о студенте

Процедура Button1Click добавляет новую запись о студенте в список. Она выполняет следующие действия:

  1. Создает новый узел (node) с помощью оператора new.
  2. Устанавливает поля f_name и l_name узла значениями из текстовых полей Edit1 и Edit2, соответственно.
  3. Найдет подходящее место в списке для вставки нового узла. Это делается путем перебора списка, пока не будет найден узел, где имя студента больше или равно имени текущего узла. Если такого узла не найдено, новый узел становится головой списка.
  4. Обновляет поле next предыдущего узла (если есть) и нового узла соответственно.
  5. Очищает текстовые поля Edit1 и Edit2 и устанавливает фокус на поле Edit1.

Отображение записей о студентах

Процедура Button2Click отображает все записи о студентах в списке. Она выполняет следующие действия:

  1. Инициализирует две переменные: n (для хранения количества студентов) и st (для хранения строкового представления списка).
  2. Перебирает список, конкатенируя имя студента, фамилию студента и символ новой строки к строке st.
  3. Отображает полученную строку в окне сообщений.

Инициализация

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

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

В статье приведен пример динамического списка в Delphi, реализованного с использованием рекурсивных указателей.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:00:50/0.0060629844665527/1