| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > программирование структур специального вида |
| Автор: milla 30.5.2012, 14:36 | ||
| Добрый день! Помогите, пожалуйста, разобраться. Есть определение структуры специального вида (блоковый список):
Как мне создать переменную типа BlockInt, состоящую из трех блоков(элементы каждого блока произвольные), и как потом к ней обратиться, чтобы вывести на экран, допустим, только второй блок, или 7-й элемент третьего блока? |
| Автор: boostcoder 30.5.2012, 14:49 |
и что же в ней специфичного? хм.. еще вчера она была двусвязным списком нужно знать хотя бы возможные типы. |
| Автор: milla 30.5.2012, 15:11 |
| Это название лабораторной -"Программирование структур специального вида"- преподавателю виднее, что в ней, структуре, специфичного))) блоковый список - оттуда же, из задания к лабораторной, если так удобнее, пусть будет двусвязный список, сути дела это не меняет каждый блок по сути это массив элементов типа int необходимо создать такой вот блоковый список, а затем провести над ним некоторые операции - добавление, удаление, редактирование элементов. А для этого мне нужно понять, как с этим списком обращаться. Как создать новый, как записать в него элементы, как правильно к ним обратиться. |
| Автор: milla 30.5.2012, 16:29 |
| спасибо, не думала, что все так просто)))) А как работать с указателями в структуре (prev и next)? Задача такая - для этой структуры реализовать функцию вставки элемента или целого блока в заданную позицию. С элементом я в принципе поняла как быть, а с целым блоком? Чтобы вставить новый блок между первым и вторым, надо ведь как-то переопределить указатели на предыдущий и следующий блоки, правильно? |
| Автор: feodorv 30.5.2012, 17:04 | ||||||
Я что-то запутался... Двусвязный список - это отдельный разговор. В реализации - проще, в сортировке - труднее. Для него как раз и нужны prev и next. Сами элементы двусвязного списка могут располагаться в памяти как угодно. Но и последовательный доступ к элементу номер N затруднён - нужно проходить по связям, отсчитывая их число. Непрерывный список состоит из набора следующих друг за другом структур. Очень простой доступ к блоку номер N - &bi[N], если отсчитывать от нуля. Здесь не нужны prev и next, так как нет связей. Но вставка нового блока затруднена, особенно если требуется вставить в середину списка. Что нужно делать в таком случае: 1/ убедиться, что в списке есть память на новый блок. Если памяти нет, то нужно её перезаказать на весь список, если реализация списка предполагает его расширение за отведённые границы. Например, если Вы объявляете
то реализация не предусматривает расширение списка за пределы 100 штук блоков. Если же так
то список bi можно приращивать и приращивать вплоть до нехватки памяти. 2/ сдвинуть блоки, лежащие на и ниже позиции вставки, на 1 элемент вниз (через memmove, например). Если новый блок вставляется в конец списка, то ничего сдвигать не нужно. 3/ на освободившееся свободное место записать новый блок. Уже не так просто, как со связным списком?))) Впрочем, если то и с блоками трудностей не должно возникнуть))) |
| Автор: milla 30.5.2012, 17:28 |
| Я почему про указатели спросила - для реализации функции вставки есть алгоритм, дословно из лекции: "вставка элемента в блок реализуется по следующему правилу если блок содержит свободные ячейки, то вставить элемент(возможно со сдвигом содержимого блока на одну позицию), увеличить счетчик иначе создать новый блок и вставить его как узел в двусвязном списке, настроив указатели prev и next, где необходимо. Осуществить сдвиг в старом блоке, хвостовой элемент поместить в нулевую позицию нового блока, добавляемый элемент в освободившуюся позицию, счетчику нового блока присвоить единицу конец_если" Так вот как настроить "указатели prev и next, где необходимо" ? Прошу прощения, если вопрос элементарный, но с указателями у меня совсем дело плохо..... |
| Автор: feodorv 30.5.2012, 18:42 | ||
Он для двусвязного списка Значит, список как был двусвязным, так и остаётся?
Тогда это иначе решается Добавлено через 5 минут и 25 секунд В чём смысл этих двух значений? Вот согласно смыслу и настраивать Добавлено через 8 минут и 24 секунды Этак новых блоков с одним элементом насоздавать можно просто завались |
| Автор: mes 30.5.2012, 19:17 |
| milla, сейчас Вас тут окончательно собьют.. У вас должен получиться связанный список блоков.. Создавать блоки должны не массивом, как предложено выше, а по одному, корректируя указатели prev и next, как у новосозданного элемента, так и у списка в который этот блок добавляется.. для этого вы должны создать нужные функции.. Чтоб было проще разбейте работу на два этапа: первый это работа со списком блоков, а второй работа с элементами в этом блоке.. |
| Автор: milla 30.5.2012, 19:41 |
| mes, вы все правильно говорите, только вся проблема в том, что я не умею работать с указателями - для меня это один большой пробел((((( Покажите на примере простеньком, как с этими самыми указателями работать, ну чему, например равны эти prev и next для моего случая, когда структура содержит 3 блока? И как они изменятся при добавлении нового блока? Как ими манипулировать, как настраивать.... |
| Автор: mes 30.5.2012, 21:01 | ||||
prev = NULL или адресу предыдущего элемента (для всегда NULL (если не кольцевой список) ) next = NULL или адресу следующего элемента (для tail/back всегда NULL (если не кольцевой список) ) для списка из одного элемента оба указателя этого элмента равны нулю.. добавление нового блока состоит из двух операций : создание и линковка .. под линковкой подразумевается связывание указателей, условно так :
тогда добавление в список нового элемента
по связанным спискам в гугле информации больше, чем достаточно..в том числе и с полноценные примеры кода.. |
| Автор: feodorv 30.5.2012, 21:08 | ||||||||
Создадим новый блок:
Теперь напишем подпрограмму вставки одного блока после другого, пока не учитывая тот факт, что список может быть пустым (то есть и b и newBlock отличны от NULLа):
|
| Автор: mes 30.5.2012, 21:11 | ||||||
в С желательно более общую информацию указывать до более конкретной,т.е
|
| Автор: feodorv 30.5.2012, 21:27 | ||
Я так понимаю, что имелось в виду - список содержит три блока...
Добавлено через 1 минуту и 18 секунд Согласен, но в данном случае я использую уже предложенный порядок |
| Автор: milla 30.5.2012, 21:46 |
| mes, feodorv, спасибо вам преогромное!!! Вразумили))) Теперь в голове более-менее прояснилось. Буду колдовать над этой лабой, вооружившись вашими советами)))) idx - действительно счетчик блока, это моя невнимательность... |