![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
Добрый день! Помогите, пожалуйста, разобраться.
Есть определение структуры специального вида (блоковый список):
Как мне создать переменную типа BlockInt, состоящую из трех блоков(элементы каждого блока произвольные), и как потом к ней обратиться, чтобы вывести на экран, допустим, только второй блок, или 7-й элемент третьего блока? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
и что же в ней специфичного? хм.. еще вчера она была двусвязным списком нужно знать хотя бы возможные типы. |
|||
|
||||
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
Это название лабораторной -"Программирование структур специального вида"- преподавателю виднее, что в ней, структуре, специфичного)))
блоковый список - оттуда же, из задания к лабораторной, если так удобнее, пусть будет двусвязный список, сути дела это не меняет каждый блок по сути это массив элементов типа int необходимо создать такой вот блоковый список, а затем провести над ним некоторые операции - добавление, удаление, редактирование элементов. А для этого мне нужно понять, как с этим списком обращаться. Как создать новый, как записать в него элементы, как правильно к ним обратиться. |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Думается мне, что так:
Полагаю, что этак:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
спасибо, не думала, что все так просто))))
А как работать с указателями в структуре (prev и next)? Задача такая - для этой структуры реализовать функцию вставки элемента или целого блока в заданную позицию. С элементом я в принципе поняла как быть, а с целым блоком? Чтобы вставить новый блок между первым и вторым, надо ведь как-то переопределить указатели на предыдущий и следующий блоки, правильно? |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Я что-то запутался... Двусвязный список - это отдельный разговор. В реализации - проще, в сортировке - труднее. Для него как раз и нужны prev и next. Сами элементы двусвязного списка могут располагаться в памяти как угодно. Но и последовательный доступ к элементу номер N затруднён - нужно проходить по связям, отсчитывая их число. Непрерывный список состоит из набора следующих друг за другом структур. Очень простой доступ к блоку номер N - &bi[N], если отсчитывать от нуля. Здесь не нужны prev и next, так как нет связей. Но вставка нового блока затруднена, особенно если требуется вставить в середину списка. Что нужно делать в таком случае: 1/ убедиться, что в списке есть память на новый блок. Если памяти нет, то нужно её перезаказать на весь список, если реализация списка предполагает его расширение за отведённые границы. Например, если Вы объявляете
то реализация не предусматривает расширение списка за пределы 100 штук блоков. Если же так
то список bi можно приращивать и приращивать вплоть до нехватки памяти. 2/ сдвинуть блоки, лежащие на и ниже позиции вставки, на 1 элемент вниз (через memmove, например). Если новый блок вставляется в конец списка, то ничего сдвигать не нужно. 3/ на освободившееся свободное место записать новый блок. Уже не так просто, как со связным списком?))) Впрочем, если то и с блоками трудностей не должно возникнуть))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
Я почему про указатели спросила - для реализации функции вставки есть алгоритм, дословно из лекции:
"вставка элемента в блок реализуется по следующему правилу если блок содержит свободные ячейки, то вставить элемент(возможно со сдвигом содержимого блока на одну позицию), увеличить счетчик иначе создать новый блок и вставить его как узел в двусвязном списке, настроив указатели prev и next, где необходимо. Осуществить сдвиг в старом блоке, хвостовой элемент поместить в нулевую позицию нового блока, добавляемый элемент в освободившуюся позицию, счетчику нового блока присвоить единицу конец_если" Так вот как настроить "указатели prev и next, где необходимо" ? Прошу прощения, если вопрос элементарный, но с указателями у меня совсем дело плохо..... |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Он для двусвязного списка Значит, список как был двусвязным, так и остаётся?
Тогда это иначе решается Добавлено через 5 минут и 25 секунд В чём смысл этих двух значений? Вот согласно смыслу и настраивать Добавлено через 8 минут и 24 секунды Этак новых блоков с одним элементом насоздавать можно просто завались -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
milla, сейчас Вас тут окончательно собьют.. У вас должен получиться связанный список блоков.. Создавать блоки должны не массивом, как предложено выше, а по одному, корректируя указатели prev и next, как у новосозданного элемента, так и у списка в который этот блок добавляется.. для этого вы должны создать нужные функции.. Чтоб было проще разбейте работу на два этапа:
первый это работа со списком блоков, а второй работа с элементами в этом блоке.. |
|||
|
||||
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
mes, вы все правильно говорите, только вся проблема в том, что я не умею работать с указателями - для меня это один большой пробел((((( Покажите на примере простеньком, как с этими самыми указателями работать, ну чему, например равны эти prev и next для моего случая, когда структура содержит 3 блока? И как они изменятся при добавлении нового блока? Как ими манипулировать, как настраивать....
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
prev = NULL или адресу предыдущего элемента (для всегда NULL (если не кольцевой список) ) next = NULL или адресу следующего элемента (для tail/back всегда NULL (если не кольцевой список) ) для списка из одного элемента оба указателя этого элмента равны нулю.. добавление нового блока состоит из двух операций : создание и линковка .. под линковкой подразумевается связывание указателей, условно так :
тогда добавление в список нового элемента
по связанным спискам в гугле информации больше, чем достаточно..в том числе и с полноценные примеры кода.. Это сообщение отредактировал(а) mes - 30.5.2012, 21:06 |
||||
|
|||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Создадим новый блок:
Теперь напишем подпрограмму вставки одного блока после другого, пока не учитывая тот факт, что список может быть пустым (то есть и b и newBlock отличны от NULLа):
Это сообщение отредактировал(а) feodorv - 30.5.2012, 21:11 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в С желательно более общую информацию указывать до более конкретной,т.е
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Я так понимаю, что имелось в виду - список содержит три блока...
Добавлено через 1 минуту и 18 секунд Согласен, но в данном случае я использую уже предложенный порядок -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| milla |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
mes, feodorv, спасибо вам преогромное!!! Вразумили))) Теперь в голове более-менее прояснилось. Буду колдовать над этой лабой, вооружившись вашими советами))))
idx - действительно счетчик блока, это моя невнимательность... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |