Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Удаление элемента из списка.
При удалении элемента из списка необходимо различать три случая: 1. Удаление элемента из начала списка. 2. Удаление элемента из середины списка. 3. Удаление из конца списка. Digit – значение удаляемого элемента.Удаление элемента из начала списка. List := Head; { запомним адрес первого элемента списка }Head := Head^.List; { теперь Head указывает на второй элемент списка } Dispose(List); { освободим память, занятую переменной List^ } Удаление элемента из середины списка.Для этого нужно знать адреса удаляемого элемента и элемента, находящегося в списке перед ним.List := Head;While (List<>nil) and (List^.Data<>Digit) do begin x := List; List := List^.Next; end;x^.Next := List^.Next;Dispose(List); Удаление из конца списка.Оно производится, когда указатель х показывает на предпоследний элемент списка, а List – на последний.List := Head; x := Head;While List^.Next<>nil do begin x := List; List := List^.Next; end;x^.Next := nil;Dispose(List);
Каждый элемент в списке с двойной связью имеет указатель на следующий элемент списка и указатель на предыдущий элемент списка. Рис. иллюстрирует характер связей в таком списке. Список, который вместо одной имеет две связи, отличается двумя основными преимуществами. Во-первых, список может читаться в обоих направлениях. Это не только упрощает сортировку списка, но также позволяет пользователям базы данных просматривать данные в обоих направлениях. Во-вторых, и прямая и обратная связь позволяют прочитать список полностью и поэтому при нарушении одной из связей список может быть восстановлен по другой связи. Это свойство имеет смысл использовать при отказах оборудования, приводящих к нарушению списка.
type AddrPointer = ^address; address = record name : string[30]; street: string[40]; city: string[20]; state: string[2]; zip: string[9]; next: AddrPointer; { указатель на следующую запись } prior: AddrPointer; { указатель на предыдущую запись } end; DataItem = address; DataArray = array [1..100] of AddrPointer;
Ниже приводится функция, которая позволяет строить список с двойной связью для записей адресов: {добавление элементов в список с двойной связью } procedure DL_Store(i: AddrPointer); begin if last=nil then { первый элемент списка } begin last:=i; start:=i; i^.next:=nil; i^.prior:=nil; end else begin last^.next:=i; i^.next:=nil; i^.prior:=last; last:=i; end; end; { конец функции добавления в список с двойной связью }
При поиске конкретного элемента списка, как и для списка с одиночной связью, делается последовательный проход по цепочке связей пока не будет найден требуемый элемент .
{ удаление элемента из списка с двойной связью } function DL_Delete(start: AddrPointer; key: string[80]): AddrPointer; var temp, temp2: AddrPointer; done: boolean; begin if start^.name=key then begin { первый элемент списка} DL_Delete:=start^.next; if temp^.next <> nil then begin temp := start^.next; temp^.prior := nil; end; dispose(start); end else begin done := FALSE; temp := start^.next; temp2 := start; while (temp<>nil) and (not done) do begin if temp^.name=key then begin temp^.next:=temp^.next; if temp^.next<>nil then temp^.next^.prior:=temp2; done:=TRUE; dispose(temp); end else begin temp2:=temp; temp:=temp^.next; end; end; DL_Delete:=start; { начало не изменяется } if not done then WriteLn('not found'); end; end; { конец функции удаления элемента из списка с двойной связью }
Порядок выполнения работы 1. Открыть проект Delphi Stuctures. 2. На главной форме в главное меню проекта добавить пункт «Лабораторная работа №5», при выборе которого должно появляться окно модуля «DinamicStuct». Для этого модуль DinamicStuct с формой добавить в проект. 3. Установить на форму модуля DinamicStuct компоненты, обеспечивающие ввод исходных данных и вывод результатов работы программы в соответствии с вашим вариантом задания (табл. 5.1), а также управляющую кнопку для запуска программного кода при нажатии на кнопку (событие onClic) в работающей программе. Для ввода и вывода в этих задачах использовать компоненты класса Tmemo. 4. В обработчике события onClic управляющей кнопки написать программный код, моделирующий работу структуры данных динамического характера, соответствующей заданию вашего варианта. 5. отладить приложение на тестовых примерах и продемонстрировать работу смоделированной структуры данных преподавателю. 6. Составить отчет о выполненной лабораторной работе, в который должны войти: а) задание, в соответствии с вариантом; б) блок-схема решения задачи; в) программа решения задачи; г) распечатка формы с демонстрацией работы смоделированной структуры данных. 7. Защитить работу преподавателю. Таблица 5.1
Контрольные вопросы 1 Определения типизированного и обобщенного указателя. 2 Что такое линейный цепной список, и алгоритмы основных операций при работе с ним. 3 Принцип работы кольцевого списка. 4 Организация стека на базе линейного и кольцевого списка. 5 Организация очереди на базе линейного и кольцевого списка. Лабораторная работа № 6
(8 часов)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-05-10; просмотров: 361. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |