Искусство программирования на Си (984073), страница 46
Текст из файла (страница 46)
Однако для односвязного спис- волн требуемый порядховмн номер ве аайдеа, ка присоединение будет несколько отличаться от вернуть Разрекеануи "атриду, поскольку г'е взменвть указателе следунаего узла тl удалять нечего о1б Ьеабег->пехк->ргеч1осв о1б Ьеабег->ргечзопв; вставки, поэтому имеет смысл написать отдельную продела элемент заголовочного сивоха связав с грамму лля присоединения элемента заголовочною „ л нв /* вмсвободвть память /* в б е/ списка.
Это упражнснис оставляю вам для самостоя- верауть разреиевиуи натрвпу с сообаеииен об (гее(о1б Ьеабег->бека11] ) тсльной проработки — не бсспокойтесь, здесь потребу- оавбке Ггее(огб Ьеадег). стоя внести лишь неЗначительные изменения в програм- Уставоввть значение указател~ аа слсдумаай ге1пгп(вр); элемент предндуаего элемевта ранним му вставки зр (пз йельде е! 1. му вставки з (пз Ьеадег е!ещеп(. зиачевам указателя ва следумава элемевт текуаего элемевта ПРЕДУПРЕЖДЕНИЕ Нужно также отмстить, ио ссли при попытке вы- УдаЛЕНИЕ ЭЛЕМЕНта ЗаГОЛОВОЧНОГО СПИСКа устааоввть значение указателя аа предмдуаий Очень важно, чтобы переменные 5Р НЕАОЕД ЕЬЕМЕМТ делить память из "кучи" она оказывается недоступной, Поскольку память под элементы заголовочного списка элемевт следуяаего элемента равинм заачеаип удалялись именно таким образом, а не просто путем то функции, которые строят разреженную матрицу указателя ва предмдуаив элемевт текущего изменения значения ивзвтело.
П и изменении значения выдсляется с помощью функции ща))ос, во избежание изменения значения уивзвтело. Ри изменении значения ВОЗвращают Ощнбкн. СВяэанНЫС С ПамятьЮ Ощибки, элемента утечки памяти необходимо, чтобы эти элементы были внсвободить память, заввмаенул даааммв — — описание которых приведено в табл. 15.1, следует про- правильно удалены.
Удаление выполняется с помощью заголовка к потере доступной длв программы памяти, и в ионеч- всрять после каждого вьщслсния памяти. Примеры та- функции Ггее и путем перестройки структуры связей внсвободвть память, заавмаемуа элементом ном счете потерянные уивзвтели займут все доступное Ких провЕрОк МОЖНО НайтИ В КОдах фуНКцИи поетрОС- заголовочного списка ЯЩ Оргоиомооя Лаоо»а раэремоиоиямотроча г часть П Глава 15 мер, который больше искомого порядкового номера.
СОВЕГ нии программы количество узлов не изменяется. Хотя Использование двусвязного списка в списке узла При таком подходе возникает одна проблема — если все г)ри поиске а даусяяэноы списке а разреженней ыатри- статичсское выделение памяти и имеет смысл для зато- имеет очень большое значение. Очень редко приложспорядкопые номера в списке меньше искомого, поиск це имеет смысл отслеживать первый элемент эагопоаоч- ловков, тем не менее, для узлов статическое выделение ние, лля которого целесообразно применять разрсжснбудст идти по круговому списку бесконечно.
(аким наес апис«о (ипи начальную »очку поиска), чтобы не про- практически нс используется. Редкими исключениями ные матрицы, нс получает никаких преимушеств от кадить список бесконечно. образом, необходимо проверять, нс достигнут ли верх могут быть диагональные матрицы, которые использу- возмозкности быстрого прохождения по соседним узлам списка, и, если достигнут, а искомый порядковый по- ются в программе многократно. Однако в обшсм случае одного измерения. Так, например, в игре "Жизнь КонКод функции ар де( пойе ((а(, которая извлекает мер нс найден — останавливать поиск. статическое вьшеленис памяти под узлы разреженной вся" приходится постоянно перемешаться межлу сосед- список узла, можно нанти на УУеЬ-сайго издательства матрицы не используется. ними узлами и выполнять вычисления.
При использо"ДиаСофт". Ниже приводится часть кода, которая рсаПрограммы, приведенные в настояшсй главе, обес- ванин жс односвязного списка в некоторых случаях лля лизуст приведенный выше алгоритм: печивают гибкость библиотеки функций для работы с возврашения на один узел назад пришлось бы проходить разреженными матрицами путем динамическою выде- всеь список.
/' Взвпечь загоповочамй спасая даавого измерения '/ пения памяти. Однако этот процесс имеет и свои недо- Если вы решите рсачизовать список узла на основе Ьеапег 11ие = а ес Ьеабег 11ие и, »)1м; статки. Поскольку память выделяется динамически, односвязною списка, рассмотрите возможность испольсуществуст вероятность того, что используемая память зования обратных указателей и применения рекурсии нс будет высвобожлена требуемым образом, что приве- при прохождении связей, что несколько снижает негагеенгп((ВР ВОВЕ ')ВВЬЬ); дст к се утечке. Кроме того, необходимо будет отеле- тинный эффект от испольювания связей только одною живать возвращаемые значения всех Функций, которые направления.
могут использоваться для выделения памяти, на случай, /» вовек в заголовочвом спаске требуемого порядкового номера »/ Вставка новых измерений ьеа»(ег е1емепг ьеааег 11яег если объем памяти нелостаточен или выделение памя- Ран ем ааааа матрица Глава 15 представляет собой положение узла в разреженной мат- Как правило, предполагается, что в алгоритмах про- Листинг 15.1. Извлечение узла разреженной матрицы.
рице. Этот упорядоченный набор чисел, или кортеж, водятся все необходимые проверки параметров. В придолжсн соответствовать количеству измерений в разрс- всленном алгоритме проверка того, находятся ли значе- аа ЗР ВКтвтКУК ВООК женной матрице. Поскольку матрица может иметь Ь~ ния, псрсдаваемыс в кортеже, внутри пределов данного *а измерений, кортеж, который представляет положение измерения, настолько важна, что этот этап был явно ** Взэпекает узел разреиеанон матраца. узла в матрице,гаюке должен иметь Н измерений.
Что- включен в код. бы иметь возможность вставлять в матрицу узлы, необ- Поскольку к первому измерению кортежа доступ ВХОДНЫЕ ДАВВЫК: ** ир — Разреиенная матрица, в которуэ будет ходимо найти способ хранения кортежегь получить очень легко и это необходимо, чтобы взять аа вставляться узел. Структура, которая используется для хранения кор- какую-то точку в качестве начальной, то из разрежен- а ° Енр1е — Еортек, хоториа аспользуетса Ллл тежсй, может показаться вам очень знакомой: ной матрицы извлекается список узла именно первого аа указааня лолоиеаня узла. *а аа Е~рэдэт эегнст э Еи 1э ( измерения.
На данном этапе узлы в списке содержат э гэс эр ир э ** ВЫХОДНЫЕ ДАВВЫЕг *а указа~ель на стек заголовков, который, в свою очередь, ** БРАВЕЕ ИАТВГХ ' — указатель на моднфиднроааавуи Ьне *иеы эсасх, П1иеаи1оаа; является стеком указателей на элементы заголовочного з елена э иатрнпу ** вт тпрьк; списка. С другой стороны, кортеж содержит стек поряд- а ° Поле л1гяенз>опз содержит количество измерений. ковых номеров, котоРые соответствУют элементам зато- ** покочвык эаеккты: которое должен представлять кортеж.
Поле зее зтасй ловочного списка. Хотя, в принципе, оба стека указыпредставляет собой указатель на стек порядковых номе- вают на одно и то жс, их нельзя с авнивать пап ямую. *' Есле возникла оаибка, устанавлнвается звачение Ров в порядке расположения измерений. Поскольку, по на "л н~ходимо преобразовать один стек в другой Сначала юбх этого поля н возвраиается указатель ноьь. такам +' своей сути, это стек, лля работы с ним используются и только потом сРавнивать их. Таким образом, на еле- *а образом, есле возвраиается указатель ипьь, =,.ао!тг Ра тра>еецаае матраца Ореацазация данмьтт Часть (! Глава 15 /' Ороверать праввпьаость задавая кортева е/ уог(спгг д1а = О! спгг дга < вр->д1мепв1опв; спгг дышет) ( ( /е ПЕраай уваэатЕЛЬ В дьвсоа1ОП Всаой уКаЗМааЕт Ва СЛЕдуааей УЗЕЛ В ПЕРВОМ ВЗМЕрЕаае, В, спгг вес (1пс *)(Гпр1е->вес + (спгг дьа))! поскольку это то, что аам аадо, моаем использовать првведеаамв авве код е/ И (('спгг вес < вр дег галсе мгп(вр, сагг дга + 1)] поде ров = *(поде ров->дьаепв1оп вгаск)! (вр->еггог по != яр дойдя)) поде уоппд !аеасар((чоьд )поде ров->абдт всаса, ( (чоьд )пеа Ьдг 1гвс, вр->егтог по = ЯР ОЬОИ! (вгг 1(яр ООд яЬядядт е! гег п((яу иоое *)иоьь)! вр->дьвепяьопв))! ) 11 ((еспгг вес > вр рек галие аак(вр, спгг дта + 1)) мьг1е ((поде ров (= пем 1гвк) Ья (!поде уоппд))! (вр->еггог по (= яр ИОВЮЦ ) ) ( вр->еггог по = яр Оагяя; угее(пем Ьдг 11вг)! гегп ((яр ИООя *)ИОЬЬ)! И (поде (оппд) ( ) геспгп(поде ров); ) /* Оолучвть спасов узла первого взмереввя е/ пеа 11вг = вр яес поде 11вг(вр, (1пг)1, е(гпр1е->пей))! ( И ((пем 11вг =- (яр ИООя ')ИОЬЬ! геоогп((яр ИООя е)ИОЬЬ); (вр->еггог по ! яр Иояяд)) Организация дан гг»о Разремееннаяматрица Часть И Глава (5 В снгг вец = (хпс «)(клр1е->веО я (спгг бза)); возрастааая порядковых номеров взмереввй слева с первого измеревия кортека до тех пор, пока ве /» Есле зу (пабе ( в этом списке ве было других ров == [ЯР ИООЕ «)ИОВО) узлов, то автоматически получал первое полоиеаве */ Ров йоппб = 1; Ьеабег рол->11гвс = пеы поде Ьеадег ров->1авк = пеы поде; 1ог (впЬ бга = О (впЬ дйа < вр->б1иепв1оак) ьь [!Ров 1оппд) ьь ()Ьас« т Сор); (вр->еггог по != ЯР ИОЕКК)) ( БпЬ б1а+») ( Тгее(пеы Ьдг лтаск) геспгп(вр); ) /' ОРопУствть текУЧее взмеревие, поскольхУ по Умолчаввп все узлы в опаске соответству "(пеы Ьдг лсаск з (спгг д1а)) = Ьеабег ров; текуаему взмеревив «/ хй (епЬ дйи ) спгг б1а) /' Орв веобходимости вставать элемевт заголовочвого спвска »/ вр гев = вр зпв Ьеадег е1еаеп1(вр, спгг бзи + 1, «спгг веО, (ЯР ВВАОЕВ ОКТА ")ИОЬЬ)) 11 (вр->еггог по )= ЯР ИОЕКК) ( Тгее(пеы Ьдг в1аск); гекпгп(вр); ) /' Получать указатель ла элемевт заголовочного спасла */ Ьеабег рол = вр Ьбг 1зак е1еаепт Оет(вр, спгг дйа + 1, »спгг вец)) 11 [(Ьеабег роз == (ЯР ВОК ЕЬЕИЕИТ «)ИОЬЬ) /* Список узлов упорядочев в порядке напРаво поэтомУ пРоходим спасов вачввая вайдем требуеиое полоиевве в спвске */ поде ров = поде Ьеаб; Ьасй 1о 1ор = О; ров Росой = О; Раяряяяяяяая матрица ВИВЕИВ Глава 15 Органялвия данных Часть )! ) ) ) ньй)е ! ° гесагп(зр); Узел в разреженную матрицу вставляетсп с помощью Восстдиовлеиие связей дб нкцни зр )пз поде.
Эту функцию можно найти н Функцию удаления зр де! поде можно найти н Файле файле зрагзе.с на %сЬ-сзйтс издательства "ДиаСофт". В зрагзе.с на Феб-сзйте изпательстпа "ДиаСофт". Функция качсстнс аргументов функция зр (пз поде принимает для восстаноацсния связей вокруг удаляемого узла исст)п ктуру ЯРАКВЕ МАТ!к(Х, кортеж, описывающий пользует следующий алгоритм: (((ьаск со сор) ьь (!Роя Тоапд) ьь положение узла, и значение, которое должно быть на(! Веке БВЬ б1м] ); знт!сно узлу навлечь удаляемым увал ) Цвкп по всем размерностям: ) Присоединение Устааовнть указатель ва следувянй узел предндуцего узла разным указателя на / ° Есин аайдеа узел, который бопьае текуцего узла, установнть указателе Я/ Прлсоеднненис узлов к разреженной матрице анзлогич- спедувянв узел удаляемого узла 1( (поде Рон .= (ЕР ИООЕ Я)ИПЬЬ) но вставке н случае использования двуснязных списков устааовить указатель аа предвдуцвй узел ( Ис Ол Ование и к стне .