Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии Программирования. 8 лекция

.pdf
Скачиваний:
10
Добавлен:
27.05.2015
Размер:
569.05 Кб
Скачать

2. Стек – СД, для которой определены операции добавления

и удаления элементов по принципу LIFO «последним пришел – первым вышел» (Lasi in - First out)

Опр. Если стек содержит только

один элемент, и этот элемент

удаляется, то в результате

выполнения операции в данный

стек больше не сможет быть

занесен ни один элемент. Такой стек называется нулевым.

Изображение стека – вертикальный

массив (столбик)

Вершина стека (Top) – позиция, куда добавляется новый элемент.

Удаление элемента из стека – перемещение указателя

Top на один элемент вниз

void(int Top)

{ if(Top = = 0) exit(1);

Top--;

}

после

Добавление элемента в стек – записываем элемент в позицию Top и перемещаем указатель Top на один элемент вверх

Void Push(int Top, int Number) { if(Top = = maxstack) exit(1);

//стекзаполнен

Stack[Top]=Number;

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

Top++;

// сдвигаем указатель

}

3. СПИСКИ - некоторая последовательность элементов, связанных с помощью указателей.

Каждый элемент списка – узел – состоит из двух частей.

Первая часть (информационная) содержит данные, принадлежащие элементу.

Вторая часть (справочная) – указатель, определяющий местоположение элемента списка, связанного с данным элементом. Например, список из элементовA,B,C,D

Стрелка связь между элементами. Указатель показывает номер следующего

элемента.

Если указатель=0, то данный элемент является последним в списке.

Однонаправленные списки один указатель, для

определения последующего элемента.

Двунаправленные списки – два указателя, для определения предыдущего и последующего элементов.

ОПЕРАЦИИ со списками

1. Создание пустого списка

void New()

{ for(i=1; i<maxlist-1;i++) List[1][i] = i+1;

List[1][maxlist]=0;

Us=1; // адрес первого элемента списка свободных мест

=

}

Замечание

Для точного и правильного использования операций над списками, индексацию элементов массива начинаем с 1.

2. Добавление нового элемента в список

- в переменную запоминаем адрес 1-го элемента списка

свободных мест - по этому адресу размещаем элемент, а в качестве указателя на

следующий элемент списка записываем номер первого элемента списка

Void Insert(int Us, int Un, int X)

{

if( Sp = = 0) exit(1); // список не содержит элементов

Pos=List[1][Us];

// находит адрес 1-го элемента списка свободных мест

List[0][Us]=x; // помещает на это место значение Х

List[1][Us]=Un;

/*в качестве указателя на следующий элемент помещает номер 1-го элемента списка */

Un=Us; Us=Pos; }

Рассмотрим подробно операцию добавления элемента Х в список.

Сначала указатель списка свободных мест Us=1,

а 1-ый элемент списка Un =0.

Первоначальный вид списка

Добавим в список элемент А, используя функцию Insert.

Вид обновленного списка, следовательно Us=2, Un =А.

Добавим в список элемент B

Вид обновленного списка, следовательно Us=3, Un =B.

Теперь список свободных позиций содержит элементы 5, 6, …, 10. Первым элементом списка является D.

Логическое расположение элементов в списке – это D,C,B,A. Этот порядок определен указателями.

3. Операция поиска элемента в списке Алгоритм

Переменной Lop присваивается значение указателя 1-го элемента

списка.

Просматриваем список до тех пор, пока не найдем нужный элемент, либо достигнем конца.

Если по окончанию процедуры Lop=0, значит нужного элемента в списке нет.

Void Find(int X, int Un)

{Lop=Un;

while(List[0][Lop]!=X && Lop!=0) Lop=List[1][Lop];

// присваиваем переменной Lop ссылку на следующий элемент

}

4. Операция удаления элемента из списке

Алгоритм

•Чтобы удалить, его надо найти в списке. Используем функцию Find.

•Если элемент найден, то удаляем. Для это изменяем указатель записи элемента, идущего в списке перед элементом Х таким

образом, чтобы он указывал на элемент, идущий в списке после

Х.

Pos – индекс элемента массива, который нужно удалить.

K - индекс элемента массива, который следует за удаленным

List[1][Pos]

// Функция удаления

Void Delete(int K, int Pos, int Us)

{ List[1][K]= List[1][Pos]; List[1][Pos]=Us; Us=Pos;

}