Технологии Программирования. 8 лекция
.pdf2. Стек – СД, для которой определены операции добавления
и удаления элементов по принципу 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;
}