Динамический список 2Delphi , Компоненты и Классы , СпискиДинамический список 2unit 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, которая реализует динамический список студентов, позволяющий пользователям добавлять и отображать записи о студентах. В главной форме (
Динамический списокПрограмма использует реализацию связанного списка, где каждый узел представляет собой запись о студенте. Каждый узел имеет три поля: Добавление новой записи о студентеПроцедура
Отображение записей о студентахПроцедура
ИнициализацияПроцедура В целом, эта программа демонстрирует базовую реализацию динамического списка на языке Delphi, позволяющую пользователям добавлять и отображать записи о студентах. В статье приведен пример динамического списка в Delphi, реализованного с использованием рекурсивных указателей. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |