Разное

C реализация списка: Реализация односвязного списка на си

Содержание

list — Функция карты с использованием haskell реализации списка

Есть ли способ написать реализацию функции Haskell map, используя реализацию списка?

Я получаю сообщение об ошибке и не думаю, что нахожусь на правильном пути. Вот что у меня есть:

map' :: (a -> b) -> [a] -> [b]
map' _ [] = []
map' xs ys = [ (x, y) | x <- xs | y <- ys ]

Мы будем очень благодарны за любую помощь или ссылку, которая направит меня в правильном направлении.

-1

legoniko

22 Окт 2017 в 19:33

2 ответа

Лучший ответ

Я считаю, что вы имеете в виду «понимание», а не «реализацию».

В любом случае это сработает:

map' f as = [f a | a <- as]
map' (* 2) [1..5]

4

pdoherty926
22 Окт 2017 в 17:01

Обратите внимание, что

map' f xs = [f x | x <- xs]

Desugars для

map' f xs = do x <- xs
               return $ f x

Который десахарирует

map' f xs = xs >>= return . f

Которое является хорошо известным определением (если вы замените map' на fmap) для определения экземпляра Functor из экземпляра Monad (тем самым доказывая, что все монады также являются функторами) .

В частности, он показывает, что понимание списка — это просто замаскированная версия определения map в терминах монадических операторов.

3

chepner
23 Окт 2017 в 00:18

46876549

Двусвязный список (Doubly Linked List). Реализация на C# ~ ЗлостныйКодер

Двусвязный список — динамическая структура данных, каждый из элементов которой содержит ссылку на предыдущего элемента и на следующего элемента.

Пример двусвязного списка:

  • Также есть головной элемент First, который является ссылочной переменной и указывает на начало списка. First.Prev=null (ограничитель)
  • Ссылочная переменная Last, указывает на конец списка. Last.Next=null (ограничитель)
  • Ссылочная переменная Current, которая указывает на текущий элемент (выступает обычно в роли итератора списка, т.е. элемента с помощью которого мы можем перемещаться по списку)
  • Беззнаковая переменная целого типа uint size, которая содержит информацию о количестве элементов в списке.

Раньше я упомянул ограничители, это специальные ссылки которые ссылаются на null. Их используют для того, чтобы обозначить конец или начало списка. То есть для того, чтобы остановить пользователя от доступа в другие участки памяти, не относящиеся к списку.

Я покажу только самые базовые операции вставки в конец и начало, проиллюстрирую и подробно опишу, что происходит. По просьбам в комментарии могу описать другой метод в списке.

Push_Front:

Цель: Вставить новый элемент в начало списка, сделав его первым, надо, чтобы, First ссылался на этот объект.

Синим отмечены ссылки, левая — Prev, правая — Next, серая — Data (наши данные), стрелки — на что они ссылаются.

В начальном состоянии Prev и Next ссылаются на null, First.Prev = null, First.Next ссылается на след объект и т.д.

  1. Мы сделаем так, чтобы новый объект ссылался на First
  2. Потом мы сделаем так, чтобы и First и newNode ссылались на новый объект.
  3. Теперь просто новый объект ссылается на предыдущий первый.

Push_Back:

Цель, добавить новый элемент в конец, Last должен ссылаться на новый объект.

В начальном состоянии Last.Next=null.

  1. Last.Next теперь ссылается на новый объект.
  2. newNode.Prev ссылается на Last.
  3. Last ссылается на новый объект.

Каждый объект описан классом Node (Узел)

  • object _Data — наши данные, которые содержатся в узле.
  • Node _Next — ссылка на следующий элемент.
  • Node _Prev — ссылка на предыдущий элемент.
  • Ну и свойства их описывающие, для доступа к ним.

Создаём приложение To-do List на чистом JavaScript | by Sergey Shambir

Вы читаете вольный перевод статьи Building a To-do List App with vanilla JavaScript. В этой статье вы научитесь простыми средствами делать простые вещи, доступные любому новичку.

И так, на данном этапе вы немного изучили HTML, CSS и JavaScript, а теперь думаете, что бы такого написать? Садитесь поудобнее, мы проедем по этапам создания простого приложения To-Do List.

Что мы будем создавать

Я проведу вас по пути создания приложения To-Do List, в котором пользователь может создавать новые списки дел (To-Dos), вычёркивать сделанные пункты или удалять их, сохранять состояние списка дел, чтобы вернуться к нему позже, и удалять список дел целиком.

P.S: Я не UI/UX дизайнер, так что если дизайн приложения кажется вам посредственным, не парьтесь 😉

HTML

Прим. переводчика: самое время открыть редактор, создать index.html и переписать пример ниже под свой стиль.

В нашем HTML мы просто создадим <div> для блока TODO, <h2> для заголовка, элемент<input>, с помощью которого пользователь будет создавать новые todo, содержащий списки дел <ul> и несколько кнопок. Ещё в примере мы подключили font-awesome, использовали его классы для классных иконок и оставили пару своих классов, с помощью которых чуть позже мы стилизуем приложение.

Вот что у нас вышло:

Скриншот страницы с HTML из примера

CSS

CSS потребуется для стилизации нашего To-Do List, и тут всё определяет ваше мастерство. Впрочем, вы можете взять готовый пример на github, с которым страница будет выглядеть так:

Задний фон реализован не за счёт изображений, а помощью цветного градиента, для создания которого использован классный инструмент UI Gradients.

JavaScript

Мы начнём с реализации механизма создания списка дел, чтобы пользователь мог ввести что-нибудь и нажать Enter для добавления пункта в список.

Прежде всего мы должны выбрать элементы input и ul на странице, используя DOM, и затем написать обработчик событий, который будет обрабатывать события нажатия клавиатуры. Все эти действия будут выполняться в функции onPageLoaded, которая вызывается после полной загрузки DOM, когда возникает событие DOMContentLoaded.

Следует отметить, что каждая клавиша на клавиатуре в JavaScript имеет предопределённый код, а код 13 соответствует клавише Enter. Для определения кода клавиши есть отличный сайт keycode.info.

Далее мы напишем функцию listenDeleteTodo, которая позволит пользователю удалять to-do.

Благодаря этой функции, каждый раз, когда пункт to-do создаётся, его иконка корзины получает способность удалять новый пункт по нажатию.

Далее объявим обработчик события нажатия на пункт to-do, зачёркивающий новый пункт как выполненный.

Теперь мы реализуем возможность сохранять и очищать состояние todo. Мы воспользуемся API LocalStorage, предоставляющим хранилище данных веб-страниц на стороне браузера пользователя.

Как обычно, мы выберем кнопки, с которыми мы будем работать из JavaScript, и добавим им обработчики события click.

В данном примере при нажатии кнопки “Сохранить” мы используем метод setItem() объекта window.localStorage, принимающий два строковых аргумента: ключ и значение. В обработчике нажатия кнопки “Очистить” мы используем метод removeItem() объекта window.localStorage, чтобы удалить данные из хранилища. Кроме того, в примере добавлены обработчики кнопок показа и скрытия элемента overlay, содержащего подсказки.

Теперь у нас осталась одна небольшая недоработка: когда пользователь повторно открывает ту же страницу в браузере, сохранённый им список дел не восстанавливается. Чтобы это исправить, мы напишем функцию для загрузки to-do.

Мы применили ещё один метод localStorage.getItem, позволяющий нам получить данные из хранилища по ключу. Сначала мы проверяем, что данные существуют, а затем устанавливаем сохранённое содержимое как внутренний html-код элемента ul, представляющего список дел. Написанную нами функцию loadTodos мы должны вызвать один раз при открытии страницы.

Вот и всё! Вы можете открыть пример автора оригинальной статьи Линды Икечукву в её github репозитории или посмотреть демо на github.io.

Список лиц, признанных политическими заключёнными Правозащитным центром «Мемориал» и преследуемых в связи с реализацией права на свободу вероисповедания и религиозной принадлежностью по состоянию на 30 октября 2019 года

30 октября, в день памяти жертв политических репрессий, Правозащитный Центр «Мемориал» публикует списки политзаключённых современной России. Сегодня в этих заведомо неполных списках, которые по сути являются лишь достоверной минимальной оценкой масштабов политических репрессий, связанных с лишением свободы, 305 фамилий. Год назад в них были включены имена 195 человек. Реальное число политзаключённых и других лиц, лишённых свободы по политическим мотивам, в сегодняшней России, несомненно, существенно больше.

За прошедший год на свободу по разным основаниям вышли 57 политзаключённых. За то же время 168 новых имён пополнили наши списки. Кроме того, десятки людей, таких, например, как часть обвиняемых по «московскому делу», некоторые из преследуемых свидетелей Иеговы или украинские военные моряки были лишены свободы и включены в наши списки политзаключённых, но позже они были освобождены из-под ареста.

Среди освободившихся В.Балух, К.Барабаш, Д.Бахолдин, Ж.Гериев, Н.Дадеу, С.Зимовец, Н.Карпюк, С.Клых, А.Кольченко, С.Литвинов, П.Милосердов, А.Политиков, В.Присич, С.Резников, И.Рудников, М.Савостин, Д.Сафаргали, О.Сенцов, Р.Терновский, О.Титиев, Д.Третьяков, В.Тюменцев, М.Цакунов, В.Шишкин и другие.

Часть из вышедших на свободу узников полностью отбыли назначенное судом несправедливое и необоснованное наказание, части судами были назначены наказания, не связанные с лишением свободы или соответствующие сроку, проведённому в предварительном заключении. Существенная часть из вышедших на свободу были освобождены в связи с передачей Украине, в первую очередь, в рамках обмена «35 на 35». Мы уверены, что в судьбах многих из освобождённых за прошедший год политзаключённых позитивную роль сыграла солидарность с ними как внутри России, так и на международном уровне. Особенно это заметно в делах Оюба Титиева и Игоря Рудникова.

За прошедший год в списки политзаключённых были внесены имена узников «московского дела» Д.Беглеца, Е.Жукова, К.Жукова, Е.Коваленко, Э.Малышевского, И.Подкопаева, С.Раджабова, С.Фомина, Н.Чирцова; обвиняемых в организации мирного протеста в Ингушетии А.Барахоева, М.Мальсагова, И.Нальгиева, З.Саутиевой, М.Ужахова, Б.Чемурзиева; фигурантов дела «Сети» Ю.Бояршинова и В.Филинкова; осуждённых по московскому делу «Артподготовки» О.Дмитриева, О.Иванова, С.Озерова; журналиста А.Гаджиева, активистов Е.Куракина и А.Мифтахова. Отдельно необходимо указать на ставших жертвами преследования по прямо антиконституционным уголовным нормам К.Котова, А.Дильмухаметова, А.Шевченко.

Имена 142 человек были внесены в список преследуемых в связи с реализацией права на свободу вероисповедания. В их числе не только мирные мусульмане, в первую очередь, обвиняемые в участии в объявленной террористической организации «Хизб ут-Тахрир аль Ислами» и в объявленных экстремистскими организациях «Таблиги Джамаат» и «Нурджалар», но и верующие свидетели Иеговы.

Мы требуем от российской власти немедленного освобождения политзаключённых, а всех разделяющих это требование призываем к солидарности с политзаключёнными и их поддержке.

Навигатор мер поддержки — Государственная информационная система промышленности

Размер субсидий на компенсацию части затрат на проведение научно-исследовательских и опытно-конструкторских работ по современным технологиям в рамках реализации такими организациями инновационных проектов (S) определяется по формуле:

S = 0,7 x (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9),

где:

a1 — расходы на оплату труда работников, непосредственно занятых выполнением научно-исследовательских работ, а также затраты на отчисления на страховые взносы по обязательному медицинскому страхованию, отчисления на страховые взносы по обязательному социальному страхованию, отчисления на страховые взносы по обязательному пенсионному страхованию;

a2 — материальные расходы, непосредственно связанные с выполнением научно-исследовательских работ, в том числе расходы на подготовку лабораторного, исследовательского комплекса, закупку исследовательского, испытательного, контрольно-измерительного и вспомогательного оборудования, закупку комплектующих изделий, сырья и материалов, изготовление опытных образцов, макетов и стендов;

a3 — накладные расходы в размере не более 100 процентов суммы расходов, определенных подпунктом «а» пункта 2 Правил предоставления субсидий из федерального бюджета российским организациям на компенсацию части затрат на проведение научно-исследовательских и опытно-конструкторских работ по современным технологиям в рамках реализации такими организациями инновационных проектов, утвержденных постановлением Правительства Российской Федерации от 12 декабря 2019 г. N 1649 «Об утверждении Правил предоставления субсидий из федерального бюджета российским организациям на компенсацию части затрат на проведение научно-исследовательских и опытно-конструкторских работ по современным технологиям в рамках реализации такими организациями инновационных проектов и о признании утратившими силу некоторых актов Правительства Российской Федерации» (кроме представительских расходов, оплаты проезда к месту отдыха, организации и участия в выставках), непосредственно связанные с выполнением научно-исследовательских работ;

a4 — расходы на оплату работ (услуг) организаций, привлекаемых для выполнения научно-исследовательских работ;

a5 — расходы, связанные с арендой необходимых для выполнения научно-исследовательских работ зданий, сооружений, технологического оборудования и оснастки;

a6 — расходы на содержание и эксплуатацию научно-исследовательского оборудования, установок и сооружений, других объектов основных средств, непосредственно связанных с выполнением научно-исследовательских работ;

a7 — расходы на государственную регистрацию в Российской Федерации результатов интеллектуальной деятельности, полученных в рамках выполнения научно-исследовательских работ по современным технологиям;

a8 — расходы на производство опытной партии продукции и ее тестирование, сертификацию и (или) регистрацию, а также на испытание;

a9 — расходы на приобретение изделий сравнения.

Ваша первая HTML форма — Изучение веб-разработки

Первая статья в данной главе предоставит вам первый опыт создания веб-форм, в том числе проектирование простой формы, её реализацию с использованием HTML-элементов управления формой и других HTML-элементов, добавление стилей через CSS и описание того, как данные из формы отсылаются на сервер. Мы более подробно остановимся на каждой из этих подтем далее в статье.

Необходимые знания:Базовое представление о компьютерах и базовое понимание HTML.
Цель:Ознакомиться с веб-формами, узнать, для чего они используются, как их проектировать, и какие базовые HTML-элементы могут понадобиться в простых ситуациях.

Веб-формы являются одним из основных элементов взаимодействия между пользователем и сайтом или приложением. Формы позволяют пользователю ввести данные, которые затем отправляются на сервер для их дальнейшей обработки и хранения или используются на стороне клиента для обновления интерфейса (например, добавление нового элемента в список или открытие и закрытие элемента интерфейса).

Веб-формы — их также часто называют HTML-формы — состоят из одного или нескольких элементов управления форм (иногда их также называют виджетами) и некоторых дополнительных элементов для структурирования формы. Элементами управления могут быть однострочные или многострочные текстовые поля, выпадающие списки, кнопки, чекбоксы, радио-баттоны, большинство из которых создаются через html-элемент <input>, однако есть и другие элементы, о которых тоже стоит узнать.

В элементах управления форм можно задать правила, указывающие на определенный формат данных или значений, которые могут быть введены (валидация форм), а также к ним могут быть добавлены текстовые строки, описывающие эти элементы для зрячих и незрячих пользователей.

Перед тем, как начать программировать, всегда лучше остановиться и подумать о вашей форме. Создание быстрого наброска поможет определить верный набор данных, которые вы хотите получить от пользователя. С точки зрения UX, удобства использования интерфейса, важно помнить о том, что чем длиннее ваша форма, тем больше риск потерять пользователей. Сделайте форму краткой и лаконичной: спрашивайте только о той информации, которая вам действительно необходима.

Проектирование форм является важным этапом при создании сайта или приложения. Удобство использования форм (UX) выходит за рамки данной статьи, однако если вы хотите углубиться в эту тему, то вам следует прочитать следующие статьи:

В этой статье мы создадим простую контактную форму. Давайте сделаем набросок.

Наша форма будет состоять из трёх текстовых полей и одной кнопки. Мы узнаём у пользователя его имя, e-mail и сообщение, которое он хочет отправить. После нажатия на кнопку данные будут отправлены на веб-сервер.

Итак, теперь мы готовы обратиться к HTML и создать нашу форму. Для этого мы будем использовать следующие HTML-элементы: <form>, <label>, <input>, <textarea> и <button>.

Прежде, чем продолжить, скопируйте простой HTML-шаблон — вы будете создавать свою форму внутри него.

Элемент

<form>

Создание форм начинается с элемента <form>:

<form action="/my-handling-form-page" method="post">

</form>

Этот элемент формально определяет форму. Он является элементом-контейнером, как HTML-элементы <div> или <p>, но при этом он поддерживает некоторые специфические атрибуты для настройки поведения формы. Все атрибуты являются опциональными, но в стандартной практике принято указывать атрибуты action и method:

  • Атрибут action определяет адрес, куда должны быть посланы данные после отправки формы.
  • Атрибут method указывает, какой HTTP-метод будет использован при передаче данных (это может быть «get» или «post»).

Теперь добавьте указанный выше код с элементом <form> внутрь тега <body> в вашем HTML.

Элементы

<label>, <input> и <textarea>

Наша контактная форма несложная: часть, в которую будут вводиться данные, состоит из трёх текстовых полей, каждое их которых связано с HTML-элементом <label>:

  • Поле ввода для имени — single-line text field
  • Поле ввода для e-mail — input of type email: однострочное текстовое поле, которое принимает только e-mail адреса.
  • Поле ввода для сообщения — <textarea>, многострочное текстовое поле.

В терминах HTML нам нужен код наподобие представленного ниже, чтобы добавить виджеты форм:

<form action="/my-handling-form-page" method="post">
  <ul>
    <li>
      <label for="name">Name:</label>
      <input type="text" name="user_name">
    </li>
    <li>
      <label for="mail">E-mail:</label>
      <input type="email" name="user_mail">
    </li>
    <li>
      <label for="msg">Message:</label>
      <textarea name="user_message"></textarea>
    </li>
  </ul>
</form>

Добавьте в вашу форму код, чтобы она выглядела так же, как форма выше.

Здесь элементы <li> используются для структурирования кода и облегчения стилизации (будет разобрано далее в статье). Для доступности и удобства использования мы указали определённый текст-подсказку для каждого элемента управления. Обратите внимание на использование атрибута for на каждом элементе <label>, который принимает в качестве значение id элемента управления формы, с которым он связан — этот подход позволяет привязать тексты-подсказки к форме.

Такой подход полезен тем, что позволяет пользователям с мышью, трекпадом и сенсорным устройством кликнуть на текст-подсказку для активации связанного с ним виджета формы, а также обеспечивает читабельное имя для пользователей скрин-ридеров. Вы найдёте более детальный разбор текстов-подсказок в статье Как структурировать HTML-форму.

В HTML-элементе <input> самым важным атрибутом является атрибут type. Этот атрибут чрезвычайно важен, потому что он определяет внешний вид и поведение элемента <input>. Вы найдёте больше информации об этом далее в статье Стандартные виджеты форм.

  • В нашем простом примере мы используем <input/text> для первого поля ввода — значение по умолчанию для данного атрибута. Оно представляет однострочное текстовое поле, которое может принимать любые значения.
  • Для второго поля ввода мы используем тип <input/email>, который представляет собой однострочное текстовое поле, которое принимает в качестве значения корректно составленный e-mail адрес. Он делает простое текстовое поле «умным», позволяя проверять введёные пользователем данные на корректность. Также это позволяет открывать более подходящие для ввода e-mail адреса клавиатуры (например, с символом @ при базовой раскладке) на устройствах с динамической клавиатурой, таких как смартфоны. Вы найдёте более подробную информацию про валидацию форм далее в статье Валидация формы.

Последнее, но не менее важное, обратите внимание на разницу синтаксиса у HTML-элементов <input> и <textarea></textarea>. Это одна из странностей HTML. Тег <input> — это пустой элемент, то есть он не нуждается в закрывающем теге.  <textarea> — это непустой элемент, что говорит о том, что ему необходим закрывающий тег. Это важно при использовании одного из свойств форм: определения значения по умолчанию. Для определения начального значения для HTML-элемента <input> вам необходимо использовать атрибут value следующим образом:

<input type="text" value="по умолчанию в этом элементе находится этот текст" />

Если вы хотите определить значение по умолчанию для HTML-элемента <textarea>, вам просто нужно поместить это начальное значение между открывающим и закрывающим тегами:

<textarea>
по умолчанию в этом элементе находится этот текст
</textarea>

Элемент

<button>

Разметка нашей формы почти готова, но нам ещё необходимо добавить кнопку, которая позволит пользователю отправлять или «представлять» информацию после заполнения формы. Это делается с помощью HTML-элемента <button>. Необходимо добавить следующий код перед закрывающим тегом </form>:

<li>
  <button type="submit">Send your message</button>
</li>

HTML-элемент <button> также принимает атрибут type, который может быть равен одному из трёх значений: submit, reset или button.

  • Клик по кнопке submit (значение по умолчанию) отправляет данные из формы на страницу, определённую в атрибуте action элемента <form>.
  • Клик по кнопке reset сбрасывает значения всех элементов управления формы к их начальному значению. С точки зрения UX, это считается плохой практикой.
  • Клик по кнопке button не делает ничего! Звучит странно, но на самом деле это очень удобно использовать для создания собственных кнопок — вы можете определить их поведение через JavaScript.

Примечание: Вы также можете использовать HTML-элемент <input> с соответствующим атрибутом type , чтобы создать кнопку:  <input type="submit">. Главным преимуществом HTML-элемента <button> в сравнении с элементом <input> заключается в том, что <input> может принимать в себя только простой текст, в то время как <button> позволяет использовать весь HTML для создания более стилизованного текста внутри кнопки.

Теперь после того, как вы закончили писать HTML-код формы, сохраните его и откройте в браузере. Вы увидите, что на данный момент форма выглядит достаточно не красиво.

Красиво стилизовать формы достаточно сложно. Эта тема выходит за рамки этой статьи, поэтому на данный момент мы просто добавим некоторый CSS-код для приведения формы в нормальный вид.

Сначала необходимо добавить HTML-элемент <style> на вашу страницу внутрь тега head в HTML. Это должно выглядить следущим образом:

<style>

</style>

Внутри тега стилей добавьте следующий код:

form {
  
  margin: 0 auto;
  width: 400px;
  
  padding: 1em;
  border: 1px solid #CCC;
  border-radius: 1em;
}

ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

form li + li {
  margin-top: 1em;
}

label {
  
  display: inline-block;
  width: 90px;
  text-align: right;
}

input,
textarea {
  
  font: 1em sans-serif;

  
  width: 300px;
  box-sizing: border-box;

  
  border: 1px solid #999;
}

input:focus,
textarea:focus {
  
  border-color: #000;
}

textarea {
  
  vertical-align: top;

  
  height: 5em;
}

.button {
  
  padding-left: 90px; 
}

button {
  
  margin-left: .5em;
}

Теперь наша форма выглядит намного лучше.

Последняя и, наверно, самое сложное — это обработка данных формы на стороне сервера. HTML-элемент <form> определяет куда и каким способом отправить данные благодаря атрибутам action и method.

Мы определяем имя name для каждого виджета формы. Указание имён важно как для браузера, так и для сервера: браузер узнаёт, какие имена дать каждой части данных, а сервер может получить эти данные, обратясь к ним по заданному имени. Данные форму отправляются на сервер в виде пары имя/значение.

Чтобы проименовать данные, вам необходимо использовать атрибут name на каждом виджете формы, который будет собирать определённую часть информации. Давайте взглянем на код нашей формы ещё раз:

<form action="/my-handling-form-page" method="post">
  <div>
    <label for="name">Name:</label>
    <input type="text" name="user_name" />
  </div>
  <div>
    <label for="mail">E-mail:</label>
    <input type="email" name="user_email" />
  </div>
  <div>
    <label for="msg">Message:</label>
    <textarea name="user_message"></textarea>
  </div>

  ...

В нашем примере форма отправит три куска данных с именами «user_name«, «user_email» и «user_message«. Эти данные будут отправлены на URL «/my-handling-form-page» через метод HTTP POST.

На стороне сервера скрипт, расположенный на URL «/my-handling-form-page» получит данные в виде списка из 3 элементов вида ключ/значение, содержащихся в HTTP-запросе. То, как скрипт будет обрабатывать данные, зависит от вас. Каждый язык серверного программирования (PHP, Python, Ruby, Java, C# и т.д.) имеет свой механизм обработки данных из формы. Эта тема выходит за рамки данной статьи, если вы хотите углубиться в неё, мы привели несколько примеров далее в статье Отправка данных формы.

Поздравляем! Вы создали свою первую HTML-форму. Вживую это выглядит так: 

Однако это только начало — пришло время взглянуть глубже. HTML-формы намного мощнее, чем то, что мы видели здесь, и другие статьи этого раздела помогут освоить остальное.

Дополнительные темы

Поиск позиции элемента в списке с ПОИСКПОЗ (MATCH)


Основное назначение этой функции в том, чтобы искать позицию заданного элемента в наборе значений. Чаще всего она применяется для поиска порядкового номера ячейки в диапазоне, где лежит нужное нам значение.


Синтаксис этой функции следующий:


=ПОИСКПОЗ(Что_ищем; Где_ищем; Режим_поиска)


где

  • Что_ищем — это значение, которое надо найти
  • Где_ищем — это одномерный диапазон или массив (строка или столбец), где производится поиск
  • Режим_поиска — как мы ищем: точно (0), с округлением в большую строну (-1) или в меньшую сторону (1)


Давайте рассмотрим несколько полезных вариантов ее применения на практике.

Точный поиск


Классический сценарий — поиск точного текстового совпадения для нахождения позиции нужного нам текста или числа в списке:

Поиск первой или последней текстовой ячейки


Если в качестве искомого значения задать звездочку, то функция будет искать первую ячейку с текстом и выдавать её позицию. Для поиска последней текстовой ячейки можно изменить третий аргумент Режим_поиска с нуля на минус 1:



Числа и пустые ячейки в этом случае игнорируются.

Поиск ближайшего числа или даты


Если последний аргумент задать равным 1 или -1, то можно реализовать поиск ближайшего наименьшего или наибольшего числа. Таблица при этом обязательно должна быть отсортирована по возрастанию или убыванию соответственно. В общем и целом, это чем-то похоже на интервальный просмотр у функции ВПР (VLOOKUP), но там возможен только поиск ближайшего наименьшего, а здесь — есть выбор.


Например, нам нужно выбрать генератор из прайс-листа для расчетной мощности в 47 кВт. Если последний аргумент задать равным 1 и отсортировать таблицу по возрастанию, то мы найдем ближайшую наименьшую по мощности модель (Зверь):



Если же третий аргумент равен -1 и таблица отсортирована по убыванию, то мы найдем ближайшую более мощную модель (Бомба):


Связка функций ПОИСКПОЗ и ИНДЕКС


Очень часто функция ПОИСКПОЗ используется в связке с другой крайне полезной функцией — ИНДЕКС (INDEX), которая умеет извлекать данные из диапазона по номеру строки-столбца, реализуя, фактически, «левый ВПР».


Так, в предыдущем примере получить не номер, а название модели генератора можно очень легко:



Ну, и поскольку Excel внутри хранит и обрабатывает даты как числа, то подобный подход на 100% работает и с датами. Например, мы можем легко определить на каком этапе сейчас находится наш проект:



Принципиальное ограничение функции ПОИСКПОЗ состоит в том, что она умеет искать только в одномерных массивах (т.е. строчке или столбце), но никто не запрещает использовать сразу два ПОИСКПОЗа вложенных в ИНДЕКС, чтобы реализовать двумерный поиск по строке и столбцу одновременно:



Ссылки по теме

структур данных — Реализация строкового односвязного списка в C

char data содержит один символ. Это не то, что вам нужно, правда? Вы хотите сохранить строку , то есть указатель на первый символ:

  struct node {
  char * data;
  struct node * next;
};
  

Он содержит строку через указатель — неясно, хотите ли вы, чтобы этот указатель был указателем-владельцем (т.е. если узел уходит, строка тоже уходит) или ссылкой (т. Е.е. кто-то другой владеет строкой и управляет ее временем жизни).

Есть и другие ошибки, но это будет хорошей отправной точкой. И включите все предупреждения от компилятора и поймите их все, потому что в случае, если ваш код, большинство из них действительно являются ошибками, которые допускает язык C (поскольку он не может быть уверен, что вы действительно хотели), но это не означает, что код правильный.

Другим способом хранения строки может быть по значению , т.е. вместо одного символа, как вы сделали в своем ответе, вы можете хранить их массив — см. Другой ответ на этот вопрос, чтобы узнать, как это сделать.Выбор между владением строкой через указатель или владением ею как значением не имеет большого значения во вводном обучающем коде, где вы не измеряете производительность структуры данных в реальном случае использования. Таким образом, не существует «единственного верного выбора»: каждый из них имеет преимущества в определенных случаях использования.

Некоторые расплывчатые рекомендации (всегда подлежат замерам!) Могут быть:

  • если значения постоянны, то удержание строки по значению либо фиксированного, либо переменного размера обычно выигрывает в производительности

  • , если значения имеют небольшой диапазон размеров (например,грамм. все строки «короткие»), то наличие узла фиксированного размера и размещение его в непрерывном пуле памяти может улучшить производительность

  • , если значения изменяются, то удержание строки по значению не всегда возможно: узел может потребоваться перераспределить, чтобы изменить его размер, а затем вам понадобится двусвязный список, чтобы настроить указатели соседних узлов, чтобы отразить новый адрес узла

  • наиболее общий и потенциально худший вариант — удерживать строку с помощью указателя-владельца, так что узел может оставаться на фиксированном адресе, но строка может перемещаться; в этом случае небольшая оптимизация строки может улучшить ситуацию еще больше, если есть много маленьких строк: удерживайте строку внутри массива char фиксированного размера узла, если она там умещается, но в противном случае выделите ее в отдельном блоке памяти; это то, что обычно делается в реализациях std :: string , и это улучшает производительность.Мысль заключается в том, что, поскольку строка является «большой», то накладные расходы, связанные с необходимостью ссылаться на какой-либо другой адрес для получения данных, будут незначительными по сравнению с любой работой, которая затем выполняется с фактическим значением этой строки.

Примеры программирования C в связанном списке — код, вывод и объяснение в Linux

В этом разделе рассматриваются примеры программирования на C в связанных списках. Каждый пример программы включает описание программы, код C, а также вывод программы.Все примеры скомпилированы и протестированы в системе Linux. Эти примеры могут быть простыми программами на C или расширенными программами на C. Таким образом, они подходят для любого пользователя (чайников, новичков или продвинутых пользователей).

Вот список примеров программирования C в связанных списках.

1. C Примеры создания и отображения элементов связанного списка

Связанный список — это динамическая структура данных, которая содержит блоки памяти, занимающие случайные ячейки памяти. Элементы в связанном списке называются узлами.Программы C в этом разделе фокусируются на создании связного списка и отображают элементы (узлы) связанного списка. Другая программа в разделах читает связанный список в обратном порядке.

2. C Примеры функций поиска и отображения связанного списка

Программы на языке C в этом разделе имеют дело с функциями поиска и отображения, которые применяются к связному списку. Функция поиска выполняет поиск указанного элемента в связанном списке, а функция отображения используется для отображения элементов связанного списка.Раздел содержит программы, которые используют функцию поиска для поиска элемента в связанном списке с использованием рекурсии и без использования рекурсии. Остальные программы используют функцию Display для отображения узлов связанного списка с использованием рекурсии и без использования рекурсии, а также для отображения узлов связанного списка в обратном порядке с использованием рекурсии и без использования рекурсии.

3. C Примеры реализации операций подсчета, длины и печати в связанном списке

Программы на языке C в этом разделе выполняют такие операции, как подсчет, определение длины и печать элементов связанного списка.Программы подсчитывают количество появлений элемента в связанном списке с использованием рекурсии и без использования рекурсии, определяют длину связанного списка с использованием рекурсии и без использования рекурсии и отображают альтернативные узлы в связанном списке с использованием рекурсии и без использования рекурсии.

4. C Примеры реализации других структур данных с использованием связанного списка

Программы на C в этом разделе предоставляют различные реализации других структур данных с использованием связанного списка.В нем есть программы для реализации стека, реализации очереди, реализации двусвязного списка, кругового двусвязного списка и двоичного дерева с использованием связанного списка. Каждый узел в двусвязном списке содержит два адресных поля, одно поле хранит адрес предыдущего узла, с которым он связан, а другое адресное поле хранит адрес следующего узла, за которым нужно следовать. Круговой двусвязный список — это двусвязный список, в котором предыдущий указатель элемента заголовка указывает на элемент хвоста, а следующий указатель элемента хвоста указывает на элемент заголовка.Двоичное дерево — это группа узлов, каждый из которых содержит левую ссылку, правую ссылку и элемент данных. Раздел также содержит программу на языке C, которая демонстрирует операции с односвязным списком. В односвязном списке каждый узел имеет единственную ссылку на другой узел.

5. C Примеры операций с элементами связного списка

Этот раздел содержит программы на языке C, выполняющие операции с элементами связного списка. Эти операции включают в себя добавление соответствующих элементов 2 связанных списков, проверку идентичности двух связанных списков, проверку того, является ли данный односвязный список палиндромом, определение количества появлений всех элементов в связанном списке.Раздел также включает поиск элемента, который является общим для обоих связанных списков, и поиск самого большого элемента в двусвязном списке.

6. C Примеры операций печати, реверса и чтения

Этот раздел содержит программы на языке C, которые выполняют операции печати, реверса и чтения. Операция печати распечатывает указанное содержимое связанного списка, операция чтения считывает содержимое связанного списка, операция удаления удаляет конкретное содержимое связанного списка, а обратная операция меняет содержимое указанного связанного списка.Программы в этом разделе распечатывают самый средний узел связанного списка, считывают связанный список в обратном порядке, удаляют повторяющиеся элементы из связанного списка, обращают вспять данный связанный список и обращают вспять первые N элементов данного связанного списка.

7. C Примеры реализации двоичного дерева с использованием связанного списка

Программы на C в этом разделе имеют дело с реализацией других структур данных, таких как упорядоченное двоичное дерево, сбалансированное двоичное дерево поиска с использованием связанного списка.В нем также есть программы, которые преобразуют одну форму связного списка в другую. Сбалансированное двоичное дерево — это дерево, в котором каждый лист находится «не более чем на определенном расстоянии» от корня, чем любой другой лист. Следующие программы преобразуют упорядоченное двоичное дерево в круговой двусвязный список, конструируют сбалансированное двоичное дерево поиска, которое имеет те же элементы данных, что и данный двусвязный список, преобразует двоичное дерево в односвязный список и преобразует односвязный список в Циркулярный список.

8.C Примеры операций обмена и изменения

Программы на языке C в этом разделе выполняют операции обмена. Они меняют местами два соседних узла кругового связного списка, касаясь ключевого поля и не касаясь ключевого поля. Другая программа в разделе выполняет операцию изменения. Он изменяет данный связанный список таким образом, что все четные числа появляются перед нечетными числами в данном связанном списке. В разделе есть несколько специальных программ, которые решают математические задачи, такие как задача Иосифа Флавия, с использованием связного списка и программа, которая выполняет арифметику с бесконечной точностью.

Реализация стека

с использованием связанного списка

Реализация структуры данных стека может быть выполнена с использованием массивов и связанных списков. Теперь давайте посмотрим на реализацию стеков с использованием связанного списка.

Операции Push и Pop в связанном списке

push ()

  • Создайте новый узел с заданными данными.
  • Проверить, пуст ли стек ( TOP == NULL ).
  • Если это e mpty , то установите указатель узла на NULL .
  • Если это не пустой , то сделайте точку узла на TOP .
  • Наконец, сделайте новый узел как TOP .

Algorithm_push ()

 if (TOP == NULL)
newNode -> следующий = NULL
еще
newNode -> next = TOP
 

pop ()

  • Проверить, является ли стек пустым ( верх == NULL ).
  • Если это пустой , тогда отобразите «ПУСТОЙ СТЕК»
  • Если это не пустой , тогда создайте временный узел и установите его на TOP .
  • Распечатать данные TOP .
  • Сделайте TOP , чтобы указать на следующий узел.
  • Удалите временный узел.

Algorithm_pop ()

, если TOP == NULL
печать "ПУСТОЙ СТЕК"
еще
создать временный узел, temp = top
печать TOP -> данные
TOP = TOP -> следующий
бесплатно (темп)

 

Теперь давайте посмотрим на программу для просмотра реализации стека в виде связанного списка.

Программа на языке C для реализации стеков с использованием связанного списка

ВЫХОД

Вставка элементов в стек

извлечение элементов из стека

Если у вас есть отзывы об этом
статью и хотите улучшить ее, напишите на [email protected]

Типы связанных списков и операции со связными списками

Типы связанных списков и операции со связными списками

В предыдущем блоге мы видели структуру и свойства связанного списка.В этом блоге мы обсудим типы связанного списка и основные операции, которые можно выполнять со связанным списком.

Типы связанных списков

Ниже приведены типы связанных списков

  1. Односвязный список.
  2. Двусвязный список.
  3. Циркулярный связанный список.

Односвязный список

Односвязный список — это набор узлов, связанных друг с другом последовательно, где каждый узел односвязного списка содержит поле данных и поле адреса, которое содержит ссылку на следующий узел .

Структура узла в односвязном списке —

  class Node {
    int data // переменная для хранения данных узла
    Node next // переменная для хранения адреса следующего узла
}  

Узлы соединены друг с другом в этой форме, где значение следующей переменной последнего узла равно NULL, т.е. next = NULL , что указывает на конец связанного списка.

Двусвязный список

Двусвязный список содержит дополнительную память для хранения адреса предыдущего узла вместе с адресом следующего узла и данными, которые находятся в односвязном списке.Итак, здесь мы сохраняем адрес следующего, а также предыдущего узлов.

Ниже представлена ​​структура узла в двусвязном списке (DLL):

  class DLLNode {
    int val // переменная для хранения данных узла
    DLLNode prev // переменная для хранения адреса предыдущего узла
    DLLNode next // переменная для хранения адреса следующего узла
}  

Узлы соединены друг с другом в этой форме, где первый узел имеет prev = NULL , а последний узел имеет next = NULL .

Преимущества перед односвязным списком —

  • Его можно перемещать как в прямом, так и в обратном направлении.
  • Операция удаления более эффективна, если указан удаляемый узел. ( Подумайте! Вы получите ответ во второй половине этого блога)
  • Операция вставки более эффективна, если указан узел, перед которым должна выполняться вставка. ( Think! )

Недостатки по сравнению с односвязным списком —

  • Для этого потребуется больше места, поскольку каждый узел имеет дополнительную память для хранения адреса предыдущего узла.
  • Число модификаций увеличивается при выполнении различных операций, таких как вставка, удаление и т. Д.

Циклический связанный список

Циклический связанный список представляет собой односвязный или двусвязный список, в котором нет NULL значения. Здесь мы можем реализовать круговой связанный список, используя односвязный или двусвязный список. В случае односвязного списка следующий за последним узлом содержит адрес первого узла, а в случае двусвязного списка следующий из последнего узла содержит адрес первого узла и предшественник первого узла. содержит адрес последнего узла.

Преимущества кругового связного списка

  • По списку можно переходить с любого узла.
  • Круглые списки — это необходимая структура данных, когда мы хотим, чтобы доступ к списку осуществлялся по кругу или циклу.
  • Мы можем легко перейти к его предыдущему узлу в круговом связном списке, что невозможно в односвязном списке. ( Подумайте!)

Недостатки кругового связанного списка

  • Если не пройти осторожно, то мы можем попасть в бесконечный цикл, потому что здесь у нас нет значения NULL , чтобы остановить обход.
  • Операции в круговом связном списке сложны по сравнению с односвязным списком и двусвязным списком, например, реверсирование кругового связного списка и т. Д.
Основные операции в связном списке
  • Обход : для обхода всех узлов один за другим.
  • Вставка : для добавления узла в заданную позицию.
  • Удаление : для удаления узла.
  • Поиск : для поиска элемента (ов) по значению.
  • Обновление : для обновления узла.
  • Сортировка: Чтобы расположить узлы в связанном списке в определенном порядке.
  • Объединение: Для объединения двух связанных списков в один.

Мы увидим различные реализации этих операций в односвязном списке.

Ниже представлена ​​структура узла в связанном списке:

  class Node {
    int data // переменная, содержащая данные узла
    Node next // переменная, содержащая адрес следующего узла
}  

Обход связанного списка

Идея состоит в том, чтобы пройти по списку от начала до конца. Например, , мы можем захотеть распечатать список или найти определенный узел в списке.

Алгоритм обхода списка

  • Начать с начала списка. Получите доступ к содержимому головного узла, если оно не равно нулю.
  • Затем перейдите к следующему узлу (если существует) и получите доступ к информации об узле.
  • Продолжайте до тех пор, пока больше не останется узлов (то есть, вы не достигли нулевого узла)
  void traverseLL (Головка узла) {
    в то время как (голова! = NULL)
    {
        печать (голова.данные)
        head = head.next
    }
}  

Вставка узла связанного списка

При вставке узла в связанный список может произойти три случая.

  • Вставка в начале
  • Вставка в конце. (Приложение)
  • Вставка после заданного узла

Вставка в начало

Так как нет необходимости находить конец списка. Если список пуст, мы делаем новый узел заголовком списка.В противном случае мы должны соединить новый узел с текущим заголовком списка и сделать новый узел заголовком списка.

  // функция возвращает заголовок односвязного списка
Узел insertAtBegin (заголовок узла, int val)
{
    newNode = new Node (val) // создание нового узла связанного списка
    if (head == NULL) // проверяем, пуст ли связанный список
        вернуть newNode
    else // вставляем узел в начало
    {
        newNode.next = голова
        вернуть newNode
    }
}  

Вставка в конце

Мы будем перемещаться по списку, пока не найдем последний узел.Затем мы вставляем новый узел в конец списка. Обратите внимание, что мы должны учитывать особые случаи, такие как пустой список.

В случае, если список пуст, мы вернем обновленный заголовок связанного списка, потому что в этом случае вставленный узел является первым, а также последним узлом связанного списка.

  // функция возвращает заголовок односвязного списка
Узел insertAtEnd (заголовок узла, int val)
{
    if (head == NULL) // обрабатываем особый случай
    {
        newNode = новый узел (val)
        head = newNode
        вернуть голову
    }
    Температура узла = напор
    // проходим по списку, чтобы получить последний узел
    в то время как (темп.следующий! = NULL)
    {
        temp = temp.next
    }
    newNode = новый узел (val)
    temp.next = newNode
    вернуть голову
}  

Вставка после данного узла

Нам дается ссылка на узел, и новый узел вставляется после данного узла.

  void insertAfter (Node prevNode, int val)
{
    newNode = новый узел (val)
    
    newNode.next = prevNode.next
    prevNode.next = newNode
}  

ПРИМЕЧАНИЕ: Если адрес prevNode не указан, то вы можете перейти к этому узлу, найдя значение данных.

Удаление узла связанного списка

Чтобы удалить узел из связанного списка, нам нужно выполнить следующие действия.

  • Найдите предыдущий узел удаляемого узла.
  • Изменить следующий указатель предыдущего узла
  • Освободить память удаленного узла.

При удалении есть особый случай, когда удаляется первый узел. При этом нам нужно обновить заголовок связанного списка.

  // эта функция вернет заголовок связанного списка
Узел deleteLL (заголовок узла, узел del)
{
    if (head == del) // если удаляемый узел является головным
    {
        вернуть голову.next // особый случай для первого узла
    }
    Температура узла = напор
    
    в то время как (temp.next! = NULL)
    {
        if (temp.next == del) // находим узел для удаления
        {
            temp.next = temp.next.next
            delete del // освобождаем память этого узла
            вернуть голову
        }
        temp = temp.next
    }
    return head // если ни один узел не соответствует в связанном списке
}  

Узел связанного списка Поиск

Для поиска любого значения в связанном списке мы можем просмотреть связанный список и сравнить значение, присутствующее в узле.

  bool searchLL (заголовок узла, int val)
{
    Node temp = head // создание временной переменной, указывающей на заголовок связанного списка
    while (temp! = NULL) // обходим список
    {
        если (temp.data == val)
            вернуть истину
        temp = temp.next
    }
    вернуть ложь
}  

Обновление узла связанного списка

Чтобы обновить значение узла, нам просто нужно установить для части данных новое значение.

Ниже приведена реализация, в которой нам пришлось обновить значение первого узла, в котором данные равны val , и мы должны установить его на newVal .

  void updateLL (заголовок узла, int val, int newVal)
{
    Температура узла = напор
    в то время как (темп! = NULL)
    {
        если (temp.data == val)
        {
            temp.data = newVal
            возвращаться
        }
        temp = temp.next
    }
}  
Предлагаемые проблемы для решения в связанном списке

Удачного кодирования! Наслаждайтесь алгоритмами.

10.7. Внедрение таблиц данных в C

10.7.

Реализация таблиц данных на C

После полного моделирования приложения,
наконец, для непостоянных данных перевод данных в
требуется конкретный код на соответствующем языке программирования, чтобы этот
код может определять необходимые структуры данных для поддержки этих
данные.Кроме того, функции, отвечающие за обработку данных, должны быть
реализовано.

Обычно одна и та же информация может храниться в разных
способами, используя один и тот же язык программирования. Например, для C
язык программирования, следующие методы могут использоваться для хранения не
постоянная информация для смоделированной таблицы (например, для фотографий или
авторов):

  1. Со статической таблицей из N элементов. Проблема в этом
    решение состоит в том, что количество элементов таблицы обычно не определено, и
    со статической памятью мы устанавливаем максимальный предел в N элементов.Если
    было бы больше этих элементов, тогда приложение не будет
    работать правильно. Кроме того, если N слишком велико и количество присутствующих
    элементов мало, то будет использовано больше памяти, чем необходимо. На
    Напротив, преимущество этого решения состоит в том, что поисковые операции
    будет быстрее, чем, например, связанный список.

  2. С непрерывной областью памяти, размер которой можно изменять
    чтобы соответствовать реальному количеству элементов, находящихся в данный момент.В этом случае,
    будет указатель, который укажет на начало этого
    область непрерывной памяти. Все элементы таблицы находятся в непрерывном
    позиций и памяти не больше, чем необходимо, потому что
    объем памяти корректируется по фактическому количеству элементов, которые
    Существуют. Для него первое выделение памяти будет выполнено с помощью
    malloc, а следующие операции добавления или удаления будут выполняться с
    realloc, чтобы отрегулировать размер выделенной области памяти до
    увеличить или уменьшить объем памяти соответственно.

  3. со связанным списком, в котором каждый элемент таблицы является
    элемент связанного списка. По мере добавления новых элементов они
    включены в связанный список; и поскольку существующие элементы
    удаляются, области памяти этих элементов освобождаются из памяти
    из связанных списков, и выполняется правильное обновление ссылок.

  4. С хеш-таблицей, имеющей разные связанные списки. Каждый
    элемент моделируемой таблицы данных, займет одну позицию в хеше
    таблица, в соответствии с результатом выполнения хеш-функции над одним из
    поля элемента.Таким образом, каждая из позиций хеша
    table будет иметь собственный связанный список. Этот способ хранения подразумевает, что M
    доступны связанные списки (размер хеш-таблицы) вместо того, чтобы иметь
    только один связанный список. Следовательно, время поиска в связанном списке
    уменьшаются из-за того, что занимают больше памяти.

Пока в этом разделе комментировали возможные
реализации в C различных таблиц данных. Кроме того, это еще и
интересно подумать о том, как реализовать отношения между таблицами, так как
фото и авторские таблицы.Среди возможных методов реализации
такое отношение, можно выделить следующие, которые также могут быть
в сочетании с предыдущими 4 методами, которые мы только что представили:

  1. Свяжите элемент фотографии с его элементом автора через
    поле таблицы, которое является целым числом, которое будет одинаковым для двух
    элементы.

  2. Свяжите элемент фотографии с элементом его автора через
    указатель, таким образом, чтобы поле элемента фото было
    указатель на начало области памяти, где соответствующий
    информация об авторе присутствует.Таким образом, несколько фотографий будут указывать на
    та же область памяти, которая соответствует их автору. В
    в этом случае поле AUTHOR_ID не будет существовать в таблице авторов,
    но его функциональность была бы заменена таким указателем. Это важно
    отметить, что не всегда необходимо, чтобы конкретное моделирование данных
    точно соответствует всем своим полям на конкретном языке программирования, так как
    это так.

В качестве примера на следующем рисунке показан случай, когда фотографии как
а также авторы хранятся в связанных списках и как взаимосвязь между
оба элемента выполнены с помощью указателей.

10.7.1.

Вопросы для самооценки

Для каждого предложения отметьте истину или ложь

Реализация стека на C ++ с использованием связанного списка

#include

using namespace std;

class stackNode {

// класс для каждого узла, который является одним элементом стека

public:

int data;

stackNode * следующий;

stackNode (int a) {// конструктор

data = a;

следующий = NULL;

}

};

stackNode * top = NULL; // верх стека инициализируется значением NULL

int size = 0; // размер стека инициализируется значением 0

void push (int x) {// операция push

stackNode * node = (stackNode *) (malloc (sizeof (stackNode)));

узел-> данные = х;

узел-> следующий = верхний;

верх = узел;

cout << x << "нажата \ n";

размер ++;

}

bool isEmpty () {// функция isEmpty

if (top == NULL && size == 0)

return true;

иначе

вернуть false;

}

int pop () {// операция извлечения

if (isEmpty ()) {

cout << "стек пуст \ n";

возврат INT_MIN;

}

остальное {

размер-;

int temp = top-> data;

stackNode * tempNode = top;

верх = верх-> следующий;

бесплатно (tempNode);

обратная температура;

}

}

int top_stack () {// операция top ()

if (isEmpty ()) {

cout << "стек пуст \ n";

возврат INT_MIN;

}

else {

return top-> data;

}

}

// основная функция

int main () {

// меню для операций

// нажмите 1 для нажатия (с данными)

// нажмите 2 для pop ()

// нажмите 3 для top ()

// нажмите 4 для размера ()

// нажмите 0 для выхода ()

cout << "нажмите 1 для нажатия \ п ";

cout << "нажмите 2 для pop () \ n";

cout << "нажмите 3 для начала () \ n";

cout << "нажмите 4 для размера () \ n";

cout << "нажмите 0 для выхода \ n";

int выбор;

cout << "нажмите ваш выбор \ n";

cin >> выбор;

while (выбор) {

if (выбор == 1) {

int data;

cout << "Введите элемент \ n";

cin >> данные;

push (данные);

}

иначе, если (выбор == 2) {

int item = pop ();

if (item == INT_MIN) {}

else

cout << "Извлекаемый элемент:" << item << endl;

}

иначе, если (выбор == 3) {

int item = top_stack ();

if (item == INT_MIN) {}

else

cout << "Верхний элемент:" << item << endl;

}

else if (choice == 4) {

cout << "Размер:" << size << endl;

}

else

cout << "Неверный номер, попробуйте еще раз! \ N";

cout << "нажмите ваш выбор \ n";

cin >> выбор;

}

cout << "Выход.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *