Динамические спискиУказатели широко используются для организации динамических списков данных. В простейшем варианте организация динамического списка типа «цепочка» каждое его звено, за исключение последнего, ссылается на следующее. Для этого в каждом звене списка, включающие некоторые данные, организуется дополнительная ссылочная часть, куда помещается указатель на очередное звено. Последнее звено списка ни на что не ссылается, поэтому значением его указателя должно быть nil. Новый вагон к поезду проще всего прицеплять с головы или с хвоста. В первом случае, когда новое звено присоединяется к списку с головы, нужно настроить его указатель на прежнее головное звено списка. После этого новое звено само становится головным. Головное звено удаляется без дополнительных настроек указателей. Если же новое звено прицеплять к списку с хвоста, то нужно указатель последнего звена настроить на новое звено, а указатель нового звена установить в nil. Возможен и третий вариант: вставить новое звено внутрь уже сформированной цепочки. Можно удалять звено из списка. После удаления последнего звена, указатель предыдущего звена нужно установить в nil. Если удаляется промежуточное звено, то указатель предыдущего звена нужно настроить на следующее за удаляемым звено. Type P=^TStudent; TStudent= record fam:string[20];// фамилия imja:string[20];//имя next:P;// следующий элемент списка end; Var head:P; // начало //добавить элемент в начало списка procedure TForm1.Button1Click(Sender: TObject); Var curr:P;//указатель на новый элемент Begin new(curr);// выделить память curr^.fam:=Edit1.Text; curr^.imja:= Edit2.Text; //добавление curr^.next:=head; head:=curr; //очистить поле ввода Edit1.Text:=''; Edit2.Text:=''; end; // вывести список procedure TForm1.Button2Click(Sender: TObject); Var curr:P;//текущий элемент списка n:integer;//длина списка st:string;//строковое представление списка Begin n:=0; st:=''; curr:=head;//указатель на первый элемент списка
|