Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
infa.docx
Скачиваний:
16
Добавлен:
27.09.2019
Размер:
305.64 Кб
Скачать

17 Линейный список. Физическое представление. Итераторы.

Пока список не меняется, его удобно отображать на сплошной участок памяти (вектор). Сплошное представление списков обладает преимуществами для представления фиксиро­ванных списков или хронологических, добавление в которых всегда идет в конец: обраще­ние к элементу списка может быть осуществлено за постоянное время за счет вычисления его адреса. При удалении элементов из сплошного списка образуются «дырки» (неис­пользуемые фрагменты). Не существует простого способа пометить удаленные элементы, кроме сдвига всех элементов, начиная с удаленного, за N/2 шагов.

Для реализации сложных динамических структур данных цепного или сплошного харак­тера принято использовать т. н. итераторы.

Для удобства организации списка и обеспечения единообразия доступа к нему опреде­лим объекты, обладающие функциями перехода от данного элемента списка к соседним. Зададим для них отношения равенства и неравенства. Два таких объекта равны тогда и только тогда, когда они указывают на один и тот же элемент списка. Также предо­ставим возможность чтения и записи элемента списка посредством введенных объектов. Такие объекты принято называть итераторами, и, конечно же, для них надо определить соответствующий тип данных.

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

struct Item

{

struct Item* prev ;

struct Item* next ;

T data;

};

Введение Not Equal() проясняет условия ветвления и

циклов и упрощает их, удаляя из них один унарный оператор. Функция Naxt() продвигает итератор к след.элементу списка. Prev() - зеркальное отражение ф-ии Naxt() . Ф-ия Fetch() нужна для чтения элемента списка, на который указывает итератор. Противоположная для Fetch() ф-ия Store() позволяет записать данные в элемент списка.

18 Линейный список. Физическое представление (массив). Если необходима большая быстродейственность и известна максимально возможная длинна списка (POOL_SIZE), то прибегают к более эффективной реализации списка на массиве.

{к перечисленным в п. 19 функциям необходимо дописать следующие}

const int POOL_SIZE = 100; //допустим макс. Размер– 100 элементов

typedef struct{

int size;

struct Item *top; //указатель напервый свободный элемент

struct Item data[POOL_SIZE + 1];

}List;

Void Create(List *l){ //создание списка

int I;

for(i = 0; I < POOL_SIZE,; i++)

l->data[i].next = &(l->data[i+1]); //односвязный список

l->data[POOL_SIZE – 1].next = 0; //терминальный элемент–нуль

l->head = &(l->data[POOL_SIZE]); //находится терминальный элемент здесь (в конце списка)

l->head->next = l->head->prev = l->head; //терминальный элемент

l->top = &(l->data[0]);

l->size = 0;

}

Iterator Insert(List *l, Iterator *i, const T){

Iterator res = { l->top}; //выделение памяти под новый элемент

If(!res.Node) //если не удалось выделить память (массив заполнен)

return Last(1);

l->top = l->top->next; //передвигаем top на следующую позицию

res.node->data = t;

res.node->next = i->node->next;// однонаправый список

res.node->prev = i->nod;

l->size++;

}

+ операции удаления элемента и уничтожения списка

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]