Различия
Показаны различия между двумя версиями страницы.
— | odnosvjaznyj_spisok [2025/07/06 12:39] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Односвязный список ====== | ||
+ | {{htmlmetatags> | ||
+ | metatag-description=(Структура данных Связный список в C#, добавление и удаление узлов. Пример реализации односвязного списка на C++.) | ||
+ | }} | ||
+ | |||
+ | |||
+ | |||
+ | {{ : | ||
+ | Односвязный список - это совокупность нескольких объектов, | ||
+ | |||
+ | Характер информации о следующем элементе зависит от того, где конкретно хранится список. Например, | ||
+ | |||
+ | Каждый элемент списка мы представим программно с помощью структуры, | ||
+ | |||
+ | 1.Одно или несколько полей, в которых будет содержаться основная информация, | ||
+ | |||
+ | 2. Поле, содержащее указатель на следующий элемент списка. | ||
+ | |||
+ | Отдельные объекты подобной структуры мы далее будем называть узлами, | ||
+ | |||
+ | < | ||
+ | //узел списка | ||
+ | struct node | ||
+ | { | ||
+ | // Информационная часть узла | ||
+ | int value; | ||
+ | |||
+ | // Указатель на следующий узел списка | ||
+ | node *next; | ||
+ | }; | ||
+ | </ | ||
+ | После создания структуры, | ||
+ | |||
+ | |||
+ | // | ||
+ | node *phead; | ||
+ | |||
+ | // | ||
+ | node *ptail; | ||
+ | |||
+ | |||
+ | |||
+ | В целом, полученный список можно представить так: | ||
+ | |||
+ | |||
+ | Итак, основные моменты создания списка, | ||
+ | |||
+ | Формирование списка. | ||
+ | Отведем место для указателей в статической памяти. | ||
+ | node *phead; | ||
+ | node *ptail; | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Зарезервируем место для динамического объекта. | ||
+ | phead=new node; | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Присвоим значение переменной ptail, и поместим в информационное поле значение элемента. | ||
+ | ptail = phead; | ||
+ | ptail-> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Поместим в поле узла адрес еще одного - нового динамического объекта. | ||
+ | ptail-> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Переменная ptail должна содержать адрес последнего добавленного элемента, | ||
+ | ptail = ptail-> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Если требуется завершить построение списка, | ||
+ | ptail-> | ||
+ | ptail-> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | В результате построен линейный односвязный список, | ||
+ | |||
+ | Вставка узла в определенное заданное место списка. | ||
+ | Здесь и далее, мы не будем приводить фрагменты кода, так как они являются крупными. Позже мы с вами просто рассмотрим пример реализации односвязного списка целиком. А, сейчас, | ||
+ | Выделить память под новый узел. | ||
+ | Записать в новый узел значение. | ||
+ | Записать в указатель на следующий узел адрес узла, который должен располагаться после нового узла. | ||
+ | Заменить в узле, который будет располагаться перед новым узлом, записанный адрес на адрес нового узла. | ||
+ | |||
+ | Удаление узла из списка. | ||
+ | Записать адрес узла, следующего за удаляемым узлом, в указатель на следующий узел в узле, предшествующем удаляемому. | ||
+ | Удалить узел, предназначенный для удаления. | ||
+ | |||
+ | ====== Реализация - односвязный список ====== | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | using namespace std; | ||
+ | |||
+ | |||
+ | struct Element | ||
+ | { | ||
+ | // Данные | ||
+ | char data; | ||
+ | // Адрес следующего элемента списка | ||
+ | | ||
+ | }; | ||
+ | |||
+ | // Односвязный список | ||
+ | class List | ||
+ | { | ||
+ | // Адрес головного элемента списка | ||
+ | | ||
+ | // Адрес головного элемента списка | ||
+ | | ||
+ | // Количество элементов списка | ||
+ | int Count; | ||
+ | |||
+ | public: | ||
+ | // Конструктор | ||
+ | | ||
+ | // Деструктор | ||
+ | | ||
+ | |||
+ | // Добавление элемента в список | ||
+ | // (Новый элемент становится последним) | ||
+ | void Add(char data); | ||
+ | |||
+ | // Удаление элемента списка | ||
+ | // (Удаляется головной элемент) | ||
+ | void Del(); | ||
+ | // Удаление всего списка | ||
+ | void DelAll(); | ||
+ | |||
+ | // Распечатка содержимого списка | ||
+ | // (Распечатка начинается с головного элемента) | ||
+ | void Print(); | ||
+ | |||
+ | // Получение количества элементов, | ||
+ | int GetCount(); | ||
+ | }; | ||
+ | |||
+ | List:: | ||
+ | { | ||
+ | // Изначально список пуст | ||
+ | Head = Tail = NULL; | ||
+ | Count = 0; | ||
+ | } | ||
+ | |||
+ | List:: | ||
+ | { | ||
+ | // Вызов функции удаления | ||
+ | | ||
+ | } | ||
+ | |||
+ | int List:: | ||
+ | { | ||
+ | // Возвращаем количество элементов | ||
+ | | ||
+ | } | ||
+ | |||
+ | void List:: | ||
+ | { | ||
+ | // создание нового элемента | ||
+ | | ||
+ | |||
+ | // заполнение данными | ||
+ | | ||
+ | // следующий элемент отсутствует | ||
+ | | ||
+ | // новый элемент становится последним элементом списка | ||
+ | // если он не первый добавленный | ||
+ | | ||
+ | Tail-> | ||
+ | Tail = temp; | ||
+ | } | ||
+ | // новый элемент становится единственным | ||
+ | // если он первый добавленный | ||
+ | else{ | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void List::Del() | ||
+ | { | ||
+ | // запоминаем адрес головного элемента | ||
+ | | ||
+ | // перебрасываем голову на следующий элемент | ||
+ | Head = Head-> | ||
+ | // удаляем бывший головной элемент | ||
+ | | ||
+ | } | ||
+ | |||
+ | void List:: | ||
+ | { | ||
+ | // Пока еще есть элементы | ||
+ | | ||
+ | // Удаляем элементы по одному | ||
+ | Del(); | ||
+ | } | ||
+ | |||
+ | void List:: | ||
+ | { | ||
+ | // запоминаем адрес головного элемента | ||
+ | | ||
+ | // Пока еще есть элементы | ||
+ | | ||
+ | { | ||
+ | // Выводим данные | ||
+ | cout << temp-> | ||
+ | // Переходим на следующий элемент | ||
+ | temp = temp-> | ||
+ | } | ||
+ | |||
+ | cout << " | ||
+ | } | ||
+ | |||
+ | // Тестовый пример | ||
+ | void main() | ||
+ | { | ||
+ | // Создаем объект класса List | ||
+ | List lst; | ||
+ | |||
+ | // Тестовая строка | ||
+ | char s[] = " | ||
+ | // Выводим строку | ||
+ | cout << s << " | ||
+ | // Определяем длину строки | ||
+ | int len = strlen(s); | ||
+ | // Загоняем строку в список | ||
+ | | ||
+ | lst.Add(s[i]); | ||
+ | // Распечатываем содержимое списка | ||
+ | | ||
+ | // Удаляем три элемента списка | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | | ||
+ | } | ||
+ | </ |
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга