![]() |
![]() |
![]() |
Указатели и динамические
переменные позволяют создавать сложные динамические структуры данных, такие
как списки и деревья.
Список можно изобразить
графически (рис. 8.6).
Рис. 8.6.
Графическое изображение списка
Каждый элемент списка
(узел) представляет собой запись, состоящую из двух частей. Первая часть — информационная.
Вторая часть отвечает за связь со следующим и, возможно, с предыдущим элементом
списка. Список, в котором обеспечивается связь только со следующим элементом,
называется односвязным.
Для того чтобы программа
могла использовать список, надо определить тип компонентов списка и переменную-указатель
на первый элемент списка. Ниже приведен пример объявления компонента списка
студентов:
type
TPStudent
= ^TStudent; // указатель на переменную типа TStudent
// описание типа элемента списка
TStudent
= record
surname:
string[20]; // фамилия
name:
string[20];' // имя
group:
integer; // номер группы
address:
string[60]; // домашний адрес
next: TPStudent; // указатель на следующий элемент списка
end;
var
head:
TPStudent; // указатель на первый элемент списка
Добавлять данные можно
в начало, в конец или в нужное место списка. Во всех этих случаях необходимо
корректировать указатели. На рис. 8.7 изображен процесс добавления элементов
в начало списка.
После добавления второго
элемента в список head указывает на этот элемент
Рис. 8.7.
Добавление элементов в список
Следующая программа
(ее текст приведен в листинге 8.4) формирует список студентов, добавляя фамилии
в начало списка. Данные вводятся в поля редактирования диалогового окна программы
(рис. 8.8) и добавляются в список нажатием кнопки Добавить (suttoni).
Рис. 8.8. Окно
программы Динамический список 1
Листинг 8.4.
Добавление элемента в начало динамического списка
unit
dlist1_; interface
uses
Windows, Messages, SysUtils, Classes,
Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TForm1
= class(TForm)
Label1:
TLabel;
Label2:
TLabel;
Label3:
TLabel;
Edit1:
TEdit; // фамилия
Edit2:
TEdit; // имя
Button1:
TButton; // кнопка Добавить
Button2:
TButton; // кнопка Показать
procedure
ButtonlClick(Sender: TObject);
procedure Button2Click(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
TForml.Button1Click(Sender: TObject);
var
curr: TPStudent; // новый элемент списка
begin
new(curr);
// выделить память для элемента списка
curr^.f_name
:= Edit1.Text;
curr^.1_пате
:= Edit2.Text;
// добавление в начало списка
curr^.next
:= head; head := curr;
// очистить поля ввода
Edit1.text:=''; Edit2.text: = " ;
end;
//
вывести список
procedure TForml.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^.1_name
+#13; curr := curr^.next;
//
указатель на следующий элемент end;
if
n <> 0
then
ShowMessage('Список:' + #13 + st)
else
ShowMessage('В списке нет элементов.');
end;
end.
Добавление элемента
в список выполняет процедура TForm1.Button1Click, которая создает динамическую
переменную-запись, присваивает ее полям значения, соответствующие содержимому
полей ввода диалогового окна, и корректирует значение указателя head.
Вывод списка выполняет процедура TForm1.Button2Click, которая запускается нажатием кнопки Показать. Для доступа к элементам списка используется указатель curr. Сначала он содержит адрес первого элемента списка. После того как первый элемент списка будет обработан, указателю curr присваивается значение поля next той записи, на которую указывает curr. В результате этого переменная curr содержит адрес второго элемента списка. Таким образом, указатель перемещается по списку. Процесс повторяется до тех пор, пока значение поля next текущего элемента списка (элемента, адрес которого содержит переменная curr) не окажется равно NIL.
![]() |
![]() |
![]() |
Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.
Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").
Максимально, на что может претендовать "мысленный эксперимент" - это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.
Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.
Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.
|
![]() |