Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Связаные списки |
Автор: FortMax 6.4.2009, 07:59 |
Кто-нибудь может на пальцах обьяснить что такое связанные списки ??? ![]() |
Автор: zim22 6.4.2009, 08:03 |
http://ru.wikipedia.org/wiki/Связный_список |
Автор: FortMax 6.4.2009, 08:15 |
zim22, это-то понятно, а вот как и для чего их применять ??? |
Автор: GoldFinch 6.4.2009, 08:32 |
FortMax, тебе их применять не надо |
Автор: FortMax 6.4.2009, 08:36 |
это почему ??? |
Автор: Static 6.4.2009, 08:49 |
имеется в виду, что если б было надо - вопрос стоял бы по-другому ![]() Например - а как сделать ОТАК? А в ответ - используй связный список ![]() |
Автор: zim22 6.4.2009, 08:54 |
это динамическая структура данных. она испольуется тогда, когда необходима. если она вам не нужна - не заморачивайтесь ![]() |
Автор: FortMax 6.4.2009, 08:55 |
я просто пока теорию штудирую=) вот на них и наткнулся, но так муторно написано, хотелось просто узнать когда и как их используют ![]() Добавлено через 1 минуту и 19 секунд ладно пока не буду |
Автор: andrew_121 6.4.2009, 09:10 |
Ответ убил ![]() |
Автор: afanp 6.4.2009, 15:27 |
FortMax, это такая фигня для хранения данных. и все данные связаны между собой одним или двумя узлами ( ну это все грубо говоря ) эх, помню долго врубался в эти указатели. если что спрашивай ) |
Автор: bsa 6.4.2009, 16:10 |
FortMax, есть несколько типов контейнеров: vector - динамический массив list - двусвязный список и др. вектор - простейший массив, размеры которого могут меняться во время выполнения программы. Все значения хранятся в непрерывном участке памяти в порядке заполнения (т.е. это аналог обычному выделению памяти через new[], только с автоматическим управлением памятью). Время доступа к каждому элементу постоянно (не зависит от размера массива и номера элемента). Добавление/вставка/удаление не с конца могут быть довольно продолжительными. Все эти операции могут вызвать инвалидацию итераторов (т.е. сделают их не валидными). лист (список) - это двусвязный список, доступ к случайному элементу которого занимает линейное время (зависит от номера элемента), вставка/удаление элементов - константна. Любая такая операция не приводит к инвалидации итераторов (кроме того, который указывал на удаляемый элемент). В простейшем виде, он делается путем добавления в структуру, описывающую элемент списка, указателей prev и next, которые указывают на предыдущий и следующий элемент списка соответственно. |
Автор: Cheloveck 6.4.2009, 16:12 | ||
Напугали человека, теперь он будет связные списки всячески избегать. На самом деле если разобраться, то это абсолютно просто. Есть минимум два класса (хотя, можно обойтись и одним, но это сложнее и запутаннее), первый класс имеет указатель на объект второго класса и называется головным. Второй класс, в нашем случае (довольно упрощённом), является телом. В нём находится указатель на объект того же класса. Когда мы добавляем к списку новый объект, мы сообщаем об этом головному классу. Тот смотрит, если в его указатель уже что-то записано, то он делегирует размещение нового элемента этому объекту (иначе новый элемент заносится в этот указатель). Объект проверяет свой указатель и если он пуст, присваивает ему адрес нового элемента, если нет - передаёт дальше. Преимуществом такого подхода является манипулирование группой объектов из головного класса и наличие только одного указателя. Недостатком - время выполнения, чтобы получить доступ к определённому объекту, нужно найти его какой-либо идентификатор (конечно нужно позаботится о его создании заранее) перебирая по порядку все объекты.
нельзя применять контейнеры не зная, что они делают... имхо |
Автор: Slammer 6.4.2009, 17:54 | ||
Всем привет. Решил не создавать новую тему, потому что тоже начал учить связной список, поскольку надо выполнить задачку: Сделать односторонний связной список, в который вводим целые числа. И к ней функцию, которая выкидывает из списка те элементы, за которыми идут парные числа. Можно попросить пдправить ошибки в этом коде, чтобы хотябы компилятор не ругался?(( Спасибо!
|
Автор: zim22 6.4.2009, 18:06 | ||
не ругается.
|
Автор: FortMax 7.4.2009, 07:09 |
![]() |
Автор: zim22 7.4.2009, 07:42 |
FortMax, ? |
Автор: Slammer 12.4.2009, 17:22 | ||
Спасибо zim22. Есть ещё один вопросик косательно функции. Ф-я должна выбросить все те элементы из списка, за которыми идут парные числа. Вродебы написал логически правильно, но она не работает .. ? хелп
|
Автор: Slammer 15.4.2009, 22:02 | ||
Спасибки. Немного подравил, но всёравно где-то допустил ошибку, или в удаление или в печати. Поможете найти? В приложении показан ввод и нправильный вывод (должны быть 2 двойки) Зарание признателен.
|
Автор: bsa 16.4.2009, 15:01 |
Slammer, а отлаживать пробовал? Пройдись по шагам. |
Автор: Dov 18.4.2009, 05:54 | ||
|
Автор: yeputons 19.4.2009, 21:47 |
FortMax Связные списки удобно применять для такой задачи, которая регулярно (по крайней мере, у меня) возникает: есть массив, в который хотелось бы научиться быстро добавлять/удалять элементы и перебирать все элементы. Если реализовывать это через обычные массивы/vector, то при добавлении элемента в начало требуется сдвигать все остальные элементы на 1. Это требуется около N операций, где N - старая длина массива. Если же решать эту задачу с двухсвязными списками, то удаление/добавление элемента из такого списка происходит за ~3 операции. Экономия времени очевидна))) Если же не важно время выполнения (например добавляешь/удаляешь элемент один или два раза) - то используй vector - с ним гораздо удобнее и проще. |
Автор: zim22 20.4.2009, 07:00 | ||
используйте deque и будет вам вселенское счастье |
Автор: FortMax 23.4.2009, 03:07 |
спс, всем, примерное представление сформировалось ![]() |
Автор: Slammer 23.4.2009, 22:24 | ||||
Dov, это очень мило и я бы даже сказал красиво. Мешок картошки за вложеный труд.. но я больше половины не понял.. ![]()
![]() Опять прошу подправить мой код функции nodeDel. Которая должна удалять те элементы из списка, за которыми идут парные числа, я просто не могу найти ошибку, хоть и кажется что всё правильно. :-( пример список с элементами - 1(первый), 1, 2, 2(четвёртый) должен преоброзоватся в 1(первый), 2(четвёртый->во второй) пожалуйста, обьясните как можно проще. Спасибо всем!
|
Автор: bsa 23.4.2009, 23:33 | ||||
Slammer, ну и чего ты не понял? Все элементарно:
А по поводу кода своего, ну кто тебе мешает воспользоваться отладчиком? Он позволяет пройтись по программе шаг за шагом наблюдая все изменения переменных. |
Автор: Dov 24.4.2009, 01:23 | ||||
Подправляю, если тебе это поможет..
вызываешь в main так:
|
Автор: Slammer 24.4.2009, 20:05 |
Dov ![]() Отладчик.. некогда им не пользовался (оно и видно), сейчас смотрю.. Всем спасибо ![]() |