Искусство программирования на Си (984073), страница 34
Текст из файла (страница 34)
Он также з вов панерхноста (точность составляет Рзгзе = Оьйееоаеа(ььве, ИОЬЬ, МОЬЬ)! содержит небольшое количество леревень (в которых нет првмерно +/- 30 мель) . мйгуе(ИОЬЬ ! 1деев(впссег международных аэропортов). Элементы этого файла «/ в[аеас Впу[ег, мйгье(ОЬСеедехС(ььве> !« МОЬЬ> разделяются запятыми. 1пе Са1согеаСС1гс1ео1веапсе(С1ТТ «С)еу1, С1ТТ Гр>) ( *Сгеу2> ( ЬЬвС = ОЬСеенехе(ь[ве>! /* Стандартные заголовки Овйла вырезаны «/ ( 11(рагвеСгеу(ьтйсвс[су впу[ег) ) весопд = ОьсеСОаеа(Ь1ве, ИОЬЬ, МОЬЬ)! гегагп (1пе)(3956.934132687 * ( 41пс1псе "0111вс.й' асов((вьп(ссеу1->Ьаесеасе) * гу(++Мпнс111ев >а МахСШев) Озвеапсе вгп(С[еу2->Ьаезапсе)) + ( Са1согеаССггс1еогвеапсе(Рггве [Се1«ае Р1 3.14159265358979323846 ([сов(сзеу1->Ьаезепде) +«Махс111ев! Еесопд)! сов(ссеу2->Ьаесепсе)> * НахСШев *а 3; Страде! вегасе Сгтт ((сов[Сзеу1->Ьопд)ваде) * МахСШев /= 2; рггпСТ( ав — ав: 80 нз1ев.1л", ( сов(сзеу2->Ьопдсспде)) + 81гве->ссеуване, весопа->С1Сунане, 30> (згп(сгеу[ >Ьопд1еаде) Тенр Органа«ах««а банан« ЩЯ— « Часть и Прха«ыа абстракт«ее а Циклические списки мент, но при необходимости может поворачивать и на а пиклнческий список позаботится о себе сам.
Заглав- применять; следовательно, вставлять новый элемент большее число элементов. Эти врашения осушествляют- ньш у «ел позволяет также хранить дополнительную будем после этого последнего элемента, так чтобы ука- Цнкличсские списки — это одно- или лвусвязныс спис- ся очень быстро, зак как в действительности данные в г«элемен а быч нацелен теперь на информацию, связанную не с отдельным элементом датель г«ет текушего элемента ыл нацелен теперь на ки, которые, если можно так выразиться, гоняюзся за памяти нс перссылакпся — требуется только присвоить списка, а со списком в целом.
Мы воспользуемся этим, новый элемент. своим собственным хвостом А указывает на В, В ука- новос значение указазслкз. На рис. ».4 показано, как с чтобы хранить счетчик числа элементов в списке. ассмотрим д авление в список вто о о элеме зывает на С, С указывас( на Р, О указывает на Е и Е помощью указателей списка образуется кольцо, при р устоя д авить его как штеп- указывает на А. Онн лучше всего подходят лля никли- этом каждыи элемент списка хранит указатель на дан- Листинг 11.12. Библиотека циклического списка.
час, когда в списке только один элемент, Сштевт->Ргеч ческих данных. Например, рассмотрим расписание дви- ные приложения. Еуребе1 вегасе СЬ 1ТЕИ жсния поезлов с 24-часовь|м периодом (расписание ( новый элемент удет указывать и нггеп- повторяется каждые 24 часа). Если в 9 часов вечера кли- ЗВГЛВВНЫИ УЗЕЛ 1ле Та>П Сштепт->Рген Олнако, если мы примем во внимание сит спрашивает, какие поезда бутбт оз правляз ься в бли- аггаст СЬ 1ТЕИ 'Реет; Заглавный узел никоим образом нс играет сушссзвсп- — циклическую природу данной ситуации, то увидим, что жайшнс 6 часов, то он, цо-видимому, хотел бы усшл- атгисс СЬ 1ТЕИ «Еехт; ной роли в циклическом списке, но он может в огром- аозб «ОЬ ес>Ы это правильные действия.
шать нс только о тол« поезде. которыи отправляется в роз зес нон степени упростить код программы. В некоторых рс- 51хе 1 Баге; Вот код, вставляющий в список новые элсмснтьс 2>.38, но и о золц которын отправляется в 0»:9. Цнкализациях циклического списка указатель последнсгп > СЬ 1ТЕИ; хьь Сьабб1сет [СЬТБТ *Ь1ес, личсскии список прекрасно подхсынт для пон задачи. элемента направлен на заглавный узел.
Это может дать 1ве Теч, Из-за с«о цин«ичсскон природы в нем отсутствуют пер Гуребе1 атгась СЫБТ обратнын эфФскт и усложнить код. По-видимому, для выи и последний элементы Поэзому' полезно ввести последнего изс««ента как-то более естественно указывать СЬ 1ТЕН «Сеггеат1еее; понятие тскушсй позиции, через котс рук« выполняютна первый элемент, в истинно циклическом стиле. в«ге 1 Иви1сеяаз ся все операции (это хорошо видно на рис. !1.4). Если Мы будем использовать заглавный узел (листин~ > СЫБТ; зае аеаа11 = СЬ БОССЕББ; нхжич>1(>1 элсн««Взад 1(а«ХР«титаса нс,на гскУп1су) позиции, то ..., ' за еав Прет ты е ад<тракт нее струна урн данньн аввегг(Ьзас ( ИОЬЬ] Иева11 = (нРеас)(ТЫа1ьеи->тед, ТЫагтеи->ОЬ)есг Агдв); Оргонитаннданнь> Часть и — Глава 11 Восстановление и обновление данных 11(шяг->Ипи1сеиа > О) Ывс->Сеггеас1сеи = Иехс1геиз ( Иевстгеи->Ргет = Ргетгсеи Если леы ограничимся восстановлением только элсмсн- 11(Р1асев < О) Ргет1сеи->Иехг = Иевг11еиз гсг(тывггеи = Ьзвс->оаггеашгеи, з - ОГ за, находяшсгося на текущей позипии, то сделать это ( О == Иева11 аа иа1ыр1е = (ывг->ивв1геиа — 1 1 < (1ае)Ыег->Иии1сеивз можно просто.
Необходимо только возвратить указатсль Р(асев) l / ггее(ТЬ1в1геи); ТЫвггеи = Тйгв1геи->иехг, з++) на данные зскушсго элсмснта. Обновлснис данных тоже является очень легким делом. В данной главс уже рас- Р1асев += ие1с1Р1е * Ывг->иви1сеив; — Ь(аг->Иви11еивз сматривалась обшая идея; чтобы увидеть исходный код, ) ) заглянитс в файл сН(я(.с на %сЬ-сайте "ДиаСофт". Р1асев Ь= Ывс->Иви1сеиа. гетега Ое1етед; ) Вращение списка гетега Иева11, Мы возвратили целое число, чтобы указать, дсй- ) Эффективное врашснис списка является интересным Р1асев = Ьзвг->Иаи1теив — Р1асеа; СЕ()евтгоуп тривиальной.
Зго один из тех редких слу- РЕШЕНИЕ ЗадаЧИ ИОСИфа личсский, у не~ о есть и<которые обшис свойства с арифметическими опсрапиями по модулю. Пусть нам гребу- Ывг->Сиггеасгсеи = Ьгвс->Сеггеасггев->Рген; акта, что я действительно стрсется повернуть список на Р мест и в списке имеется )Ч ) мился к тому, чтобы оператор управления циклом выных для нашей демонстрационной программы будет элементов. Первая оптимизация, которукз можно выполнить, — уменьшить Р заким образом, чтобы оно нахо- тор, лостойный этого звания, удалит оператор соп1!пас.
лилось в диапазоне от 0 до (х(-(. Для этшо нужно ис гог(з = О- з. < Р1асев з++) Иосиф (Р(ат(цз )озсрйцз) (37 н. э. — ок. 100 н. э.) был Органиэация данны» При«ение ай а)рикнэные енэр> кнэуры донных ~$~~ 1 Часть Н Глава 11 Рассмотрим круг вз И элементов. Испи удалвть Х-й элемент, то останется И вЂ” 1 элементов. 1((КХЬТ КОССКОК == Вело>Г> 'коли эту процедуру повторять, то действвтельио останется только одев элемент. Иаков? 'Ответ дает эта программа. вй>1е(С>гс1е.дов1севн > 1) ВОЬЬ ськогаге(ссггс1е, х); рг1пс(('Вевоч1пд эсеи $1о.1п", сваг **Техс; «(опн1дпед 1опд *)сьдегвага(ьсггс1е, сваг Ьоутег(32)) ИОЬЬ, сваг »епдр) ИОЬЬ)); СЬ|КТ Сггс1е = (0)) сьое1еге(ссггс1е); гпс Вевп>Г = КХ>т ВОССКВК) э'» Коли удалвть одне элемент, то текуаим станет следувииа за вим.
Зто сбивает вав счет опвьдпед 1опд И; еа едвнацу, поэтому лонервеи круг назад на одев узел (элемент), нпн1длей 1опд х) »/ ппнгдпед 1опд СЬВосасе(ЬС1гс1е, -1); > 1 (твкс = упс ; »тЕХГ )и ИОЬЬ) ++тЕХГ> ( рг>пс(( Тйе 1аас эйев гв $1о.1п роса(*Техс); *(спв1дпед 1опд »)СЬСесцаса(ЬС>гс1е, ВОЬЬ, ИОЬЬ)); рога(">пкпн ваву ггевв гп гйе ггпдг"); 11(идьь == удегв(ппутег, в1геоу ьоутег, вгй1п)) сьцевггоу(ьс1гс1е); Пр«- емс "р ' и р)ктЗрнданп ИВЮЮРВ ) Глава 11 Ор~анизпциз диниче чвс\ъ Й няются в калькуляторах с обратной польской записьнз нового типа ВТАСК и адрес этой структчры перевалим бклут зависсзь от библиотеки стека, повторно исполь(Кетеглс Ро)В)з )л)о)аг)оп) при анатизе и вы шслснии вы- в функции, которые булут осутцесгвлять занесение и из- зуюшей структуру Б1Л.1ЯТ.
В настояший момент зта ражений и во множестве прилладныл задач. В качестве влечение данных. ился кажется прекрасной, но. возможно, через год мы ) примера программы рассмотрим одну ~акую задачу. кое-что усовершенствусм, и зогла все этн прикладные Ото было слелано с чудесной легкостью — пришлось большинство стеков, которые мне встречались в СОЗДВИИВ СТВКВ программы прилется перекомпилировать и перекомпо- только вызвать кол, который был написан раньше. Как кодах программ, были реализованы плохо. Код почти Наш стек очень простой (листинг ) ).) 3). новывать.
а это плохо (Если мы изменяем содержилюе можно было зал~етитсл был определен новыи набор л~акнеизменно был написан как часть приложения, а нс как структуры ЯТАСК, то это подразумевает необходимость росов контроля огвибок в кодс стека, так как мы не хоавтономная, повторно используемая библиотека (По- Листинг 11.13. Создание стека. перекомпиляции всех программ, используюших функ- тич. чтобы пользователи-программисты были вынужлевторное использование кола — это Свяшенный Грааль Страде( вегасе втаек ции из библиотеки стека.) Необходимость рсдактиро- ны писать код, зависяший от того, что в определении языка С++.
Поклонники этого языка постоянно пыта- вать при этом и прикладной код была бы весьма неже- стека была использована структура Б1Л.)БТ. Оператоются найти примеры повторного использования кола, )ьвпдес воеввс лательнай и потенциально лорогои. Однако если чы ры контроля нс гарантируюз правильную иниципчизано, похоже, никак не могут ил найти. с другои сторо- зпс сьесктпсс); просто включаем файл $П)вг.й в файл втасй.й, то избега- цию стека (в частности потому, что они исчезают, если ньц приверженцы языка С в течение многих лет повзор- ем этой проблемы и ограждаем пользователя-програм- )Ч)УЕВ))б определена), но они дают нам разумную стено исполыуют коды программ, делая это без особого $ьы$т *всесквсг) миста от ненужной информации о том, что в реазиза- пень зац)иты от случайной небрежной инициализации.
шу ма ' у них п)зост о нет никакои пот )зебност13 г)ломко вазе с вел)сева ции стека используется код списка. кричать об этом. Но по какой-то нспонятнои причине Поэтому с нскозорой неохотой выбираел~ второй ИЗВЛВЧВНИВ ЗЛВМЮНТОВ эта блестяшая история повторного использования про- 111пдес ввввва вариант — включаем зВ)з(.Ь в в)асй.й, но, по крайней П оцс нз„кенеш,я элен,ентов так же п с как п о грамм, по-видимому, нс включает в себя стеки, по край- зпс ейескзп112) лзере, мы испьцываем Уловлетворснис от сознаниЯ того, ~ Код е написан бо е ч наполо)епдззв Пргктие ибгтратпнне гтрукттте Эанннт Глава 11 Органнзацин даннпа ! ЧастЫ! сЬаг *р; /* тьпй а */ сЬаг 'О; /* Рыли > */ геелгп Беаск->илвгеевгы сваг *еаггау = ИОЬЬ; /и файл ВТНЬ е/ Сохранение природы стека 1пс Солпс = О; [пс Еггог; 1лс гоиа; 1пс ЕЫпгое; вевсру(ОЬ)есс, р, 5гхе); ) е1ве ( йеап11 = БТАСЕ РОР РА1ЬОВЕ [лс Бсаелп ЕЕЬТ БОССЕББ Вепл11 = БТАСЕ ЕНРТТ геелгп йепл11.