ALTE DOCUMENTE
|
||||||||
Программы позиционирования для раб&# 17317r1722r 1086;ты со списками
Допустим, что в главной программе, раб&# 17317r1722r 1086;тающей со списком, построенным в результате выполнения функции createlist(20) double latitude поместить широту населенного пункта, название которого находится в элементе village k number k
knotpointer
struct scb
;
int lenth; // Число узлов в списке
struct scb *current; // Указатель на текущий узел
struct scb *listbeg; // Указатель на первый узел
struct scb *listend; // Указатель последнего узла
// knotpointer: получает адрес k-го узла
struct scb *knotpointer(int k)
}
else
}
else
printf((" !\n"
return(current);
}
k<1 k>lenth
Возвратимся к поставленной задаче получения широты пункта. Имея программу knotpointer
void main void
Следует отметить, что могут быть и более сложные программы позиционирования. Если, например, нужно получить адрес узла, ближайшего в смысле координат к точке, широта и долгота которой - это аргументы программы позиционирования, то нужно запрограммировать дополнительно алгоритм получения точных расстояний между двумя произвольными точками на поверхности Земли. Для точных расчетов обычно Земля представляется в виде геометрического тела вращения, называемого эллипсоидом Красовского (в данном пособии мы это рассматривать не будем).
Списки могут расширяться за счет включения дополнительных узлов. Причем линейные списки желательно после этого перенумеровывать. Программа knotin добавления нового узла в соответствующее место может раб&# 17317r1722r 1086;тать различным образом. Для нашего двунаправленного списка типовыми будут два способа:
1) новый узел нужно поставить в список между двумя узлами, имеющими наиболее близкие координаты на поверхности Земли (этот случай мы не будем рассматривать из-за его сложности);
2) новый узел с номером k k lenth k lenth-k
Списки могут сокращаться за счет исключения имеющихся узлов. Причем линейные списки желательно после этого перенумеровывать. Программа knotout исключения узла из соответствующего места списка может раб&# 17317r1722r 1086;тать различным образом. Для нашего двунаправленного списка типовыми будут также два способа:
1) нужно в списке найти узел, ближайший к точке, чьи географические координаты указаны в качестве аргументов knotout
2) нужно найти узел с номером k k lenth lenth-k и уменьшив их номера на единицу.
Упражнение 8-1. Написать функцию knotin(k true k false k поставить в список невозможно.
Упражнение 8-2. Написать функцию knotout k true k false k
|