Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Списки. (Списочные структуры)




Динамические структуры данных.

Агрегативные переменные

Простейшей агрегативной переменной является массив (упорядоченный набор данных одного типа).

На метоязыке: declare A(10) integer;

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

Доступ к элементу массива: А(2):=1;

Записи (записные типы) – более сложная структура, чем массив – она состоит из нескольких типов.

На метоязыке

Описание структуры данных:

declare 1 X,

2 Y integer;

2 Z(1) real;

X.Y:=1;

Объявление типа (Pascal):

type

Struct1 = record

x:integer;

y:array 1..10 of real;

end;

var

s:Struct1; - объявление переменной этого типа.

Замечание: Агрегативные структуры данных используются для создания более сложных структур данных: динамических и абстрактных структур данных.

Список – основа любой динамической структуры.

Опр. Список – упорядоченный набор данных одного типа. Отличается от массива тем, что имеет переменный размер (размер списка не определяется при запуске программы).

Список из n элементов --------------------------------->

Список может быть реализован 2-мя способами:

  1. на основе статических структур (массивов).
  2. на основе динамических переменных.

Пример объявления списка:

1. на основе статических структур:

type

TList = record

| DATA_ENTRIES: тип;

end;

var

List: array [1..N] of TList; {массив, N=const }

SIZE: integer; {, указывает текущий размер}

{базовые операции}

2. на основе динамических переменных:

type

PTR = ^TList; {новое поле данных имеющий тип указателя на TList }

TList = record

| DATA_ENTRIES: тип;

| NPTR: PTR {указатель на начало списка}

end;

var

LIST_HEAD: PTR; {указатель, который может указывать на начало (или конец) списка}.

Обращение к элементам списка, созданного первым способом:

List[1].DATA_ENTRIES;

List[2].DATA_ENTRIES;

List[N].DATA_ENTRIES;

Обращение к элементам списка, созданного вторым способом:

List_HEAD^.DATA_ENTRIES; - обращение к I-ому элементу

List_HEAD^.NPTR^.DATA_ENTRIES; - ко II-ому элементу

List_HEAD^.NPTR^. NPTR^.DATA_ENTRIES;

Это однонаправленный (односвязный) список – можно перемещаться только вперед.

Процедуры для динамического списка:

Исходная структура списка:

type

NameStr=string[15];

Link=^Student

Student=record

Name:NameStr;

Mark:integer;

Next:Link;

end;

var

First:Link;

Создание и инициализация динамической переменной:

var

P:Link;

New(P); {создали элемент списка}

{инициализируем элемент списка}

P^.Name:=’Иванов’;

P^.Mark:=5;

P^.Next:=nil; {пустой указатель}

Процедура добавления элемента в начало списка:

procedure AddFirst(A:Link);

{А-указатель на добавляемый элемент}

begin

A^.Next:=First;

First:=A;

end;

 

Процедура добавления элемента в произвольное место списка:

procedure AddAfter(A,Old:Link);

begin

a^.Next:=Old^.Next; { (1) А-указатель на добавляемый элемент}

Old^.Next:=A; { (2) Old-указатель на элемент списка, за которым

добавляется элемент}

end;

 

Удаление элемента из начала списка:

procedure DelFirst(var A:Link);

begin

A:=First; {сохраняем указатель на удаляемый элемент}

First:=First^.Next;

end;

Удаление элемента из произвольного места списка:

procedure DelAfter(Old:Link;Var A:Link);

begin

A:=Old^.Next; {сохраняем указатель на удаляемый элемент}

Old^.Next:=Old^.Next^.Next

end;

 

 

Поиск элемента:

function FindName(FN:NameStr):Link; {ф-ция возвращает указатель (Link) на найденный элемент}

var Curr:Link; {Curr – указатель на текущий элемент списка }

begin

Curr:=First;

While Curr<>nil do

If Curr^.Name=FN then

begin

FindName:=Curr; {возвращает указатель на найденный

Exit; элемент}

end;

else

Curr:=Curr^.Next;

FindName:=nil; {элемент не найден}

end;




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 871; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.