Опубликован: 27.09.2006 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный индустриальный университет
Лекция 13:
Изображение полиэдра
L1ListSegments.java
/** * @author Е.А. Роганов * @version 1.1 * Класс L1ListSegments, реализующий односвязный список отрезков. */ public class L1ListSegments { /** * Массив отрезков. */ private Segment[] array; /** * Массив ссылок. */ private int[] next; /** * Нил списка. */ private int nilList; /** * Нил свободного места. */ private int nilFree; /** * Элемент до указателя. */ private int before; /** * Элемент за указателем. */ private int after; /** * Связать два элемента. * @param first Первый элемент. * @param second Второй элемент. */ private void link(int first, int second) { next[first] = second; } /** * Захватить место. * @return Индекс занимаемого элемента. */ private int mallocIndex() { int index = next[nilFree]; link(nilFree, next[index]); return index; } /** * Освободить место. * @param index Индекс освобождаемого элемента. */ private void freeIndex(int index) { link(index, next[nilFree]); link(nilFree, index); } /** * Конструктор класса. * @param size Максимальный размер списка. */ public L1ListSegments(int size) { array = new Segment[size]; next = new int[size + 2]; nilList = size; nilFree = size + 1; link(nilList, nilList); link(nilFree, 0); for (int i=0; i<size-1; i++) link(i, i+1); link(size-1, nilFree); before = after = nilList; } /** * Пуст ли список? * @return Пуст ли список? */ public final boolean empty() { return next[nilList] == nilList; } /** * Сделать список пустым. */ public final void clear() { try { toFront(); while(true) erase(); } catch(Exception e) { ; } } /** * Передвинуть указатель в начало списка. */ public final void toFront() { before = nilList; after = next[nilList]; } /** * Указатель в конце списка? * @return Указатель в конце списка? */ public final boolean end() { return after == nilList; } /** * Передвинуть указатель вперед. * @exception Exception Исключительная ситуация, возникающая при * попытке передвинуть вперед указатель, находящийся в конце списка. */ public final void forward() throws Exception { if (after == nilList) throw new Exception(); before = after; after = next[after]; } /** * Получить элемент за указателем. * @return Элемент за указателем. * @exception Exception Исключительная ситуация, возникающая при * попытке получить элемент за указателем, находящимся в конце списка. */ public final Segment after() throws Exception { return array[after]; } /** * Добавить элемент за указателем. * @param val Включаемый отрезок (сегмент). * @exception Exception Исключительная ситуация, возникающая при * попытке добавить элемент в заполненный до конца список. */ public final void insert(Segment val) throws Exception { int index = mallocIndex(); link(before, index); link(index, after); after = index; array[index] = val; } /** * Удалить элемент за указателем. * @return Удаляемый элемент. * @exception Exception Исключительная ситуация, возникающая при * попытке удалить элемент из пустого списка. */ public final Segment erase() throws Exception { Segment val = array[after]; int index = after; after = next[index]; link(before, after); freeIndex(index); return val; } }