![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 25.10.2011
Сообщений: 11
|
![]()
Доброго времени суток.
Товарищи, поделитесь опытом, как хранить неориентированный граф в виде списка смежности? Только не в теории или алгоритмами, а на практике. Мне же придумалось следующее. Создаем две структуры: Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Раз уж речь идет о c++,
Код:
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 25.10.2011
Сообщений: 11
|
![]()
Интересная мысль.
А как в таком случае объявлять переменные типа Vertex? Пишу в Borland C++ Builder 6, компилятор утверждает, что "Undefined structure Vertex": Код:
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Убери точку с запятой в первой строчке )
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 25.10.2011
Сообщений: 11
|
![]()
Да, действительно, все было так просто.
Идея вообще хорошая, она мне нравится, спасибо. Но так как я с библиотекой list.h никогда не сталкивалась, я не могу разобраться, как работать с такими списками. Как обратиться к полю структуры, сравнить его с некоторым числом и записать адрес этой структуры в список адресов другой? (суть задачи: поиск двух смежных вершин и составление списка) Вот мои безуспешные попытки реализовать это: Код:
pps.up Последний раз редактировалось Fiamma; 29.10.2011 в 00:15. |
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Ну на самом деле для описанной задачи (если размеры лабиринта не придется менять после составления списка смежности) можно хранить данные вообще без использования списка. Просто создать массив (vector) из вершин, тогда номер вершины будет являться индексом в этом массиве (искать их не придется). И хранить для каждой вершины уже не указатели, а просто номера смежных вершин. Тогда код сильно упрощается.
Код:
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 25.10.2011
Сообщений: 11
|
![]()
Спасибо Вам большое за идею со списками. Я по опыту работы с паскалем пыталась изобрести их сама, а оказывается все уже придумано. Списки или векторы, наверное, - одно из самых часто используемых решений? Просветите начинающую программистку))
И вот еще какой вопрос. Правильно ли я понимаю, что тип итератора должен совпадать с типом хранимых в списке объектов? И как вообще работать с итератором? Я пытаюсь распечатать значения списка типа int - пришлось все-таки хранить номера вершин, ибо рекурсия в объявлении структуры сбивает с толку и меня, и компилятор - он говорит, что ошибка в модуле list 0__0. А мне выдается ошибка [C++ Error] Unit_main.cpp(220): E2094 'operator+' not implemented in type 'list<int,allocator<int> >' for arguments of type 'int' Код:
Ну и последний вопрос. Сама суть моей задачи - осуществить поиск в ширину по графу и найти кратчайший путь между двумя вершинами (то ест, найти выход из лабиринта). В общем алгоритм мне ясен, я нашла вот такой вод код его реализации: Код:
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
![]() Код:
Код:
в std контейнерах типы итераторов получаются из типов контейнеров: std::vector<int>::iterator std::list<bool>::iterator std: ![]() итерируются по контейнерам примерно так: list<int> lst; // fill list here for (list<int>::iterator it = lst.begin(); it != lst.end(); ++it) { *it = 0; // обнуляем значение в списке или делаем что-то другое. } для других контейнеров код такой же vector<char> vec; for (vector<char>::iterator it = vec.begin(); it != vec.end(); ++it) ... deque<bool> deq; for (deque<bool>::iterator it = deq.begin(); it != deq.end(); ++it) ... к итераторам можно применять операции, которые похожи на операции с указателями: *iterator - разыменование итератора. iterator->member - итератор указывает на класс/структуру, у которой есть мембер. такая запись - обращение к этому мемберу. всякие инкременты/декременты, в зависимости от свойств итератора. если нужен указатель на то, на что указывает итератор, то нужно его сперва разыменовать и потом взять адрес у полученной ссылки. std::list<int> lst; std::list<int>::iterator it = lst.begin(); int* p = &*it; Последний раз редактировалось _Ч_; 30.10.2011 в 02:01. |
![]() |
![]() |
![]() |
#9 | |||||
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]() Цитата:
![]() Цитата:
А начиная с 2010 студии (и в последних версиях gcc) реализовали очень полезную штуку из нового стандарта, и теперь можно писать просто Код:
Цитата:
Цитата:
Код:
Цитата:
элементам списка нельзя обращаться через квадратные скобки, как к элементам массива. Было бы поле linked типа vector<int> - пример бы работал. Компилятор разворачивает обращение linked[i] в *(linked+i*element_size) (если у linked не перегружен operator[], конечно). Отсюда и появляется странное упоминание оператор+ в сообщении об ошибке. А код с copy будет работать совсем без изменений для всех контейнеров, кстати. В этом и прелесть стандартных алгоритмов . Последний раз редактировалось Son Of Pain; 30.10.2011 в 16:45. |
|||||
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Массив списков в C | stas135642 | Общие вопросы C/C++ | 4 | 16.10.2011 15:54 |
по заданной матрице смежности простого графа построить каркас этого графа с использованием поиска вширь | d1m2o3n4 | Помощь студентам | 0 | 22.06.2011 22:43 |
Динамический массив, массив указателей | alexalisa | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 22.04.2011 21:33 |
Динамический массив - или всё таки не динамический? | vedro-compota | Общие вопросы C/C++ | 30 | 10.12.2010 23:22 |
Динамический массив | vvv-091 | Фриланс | 4 | 01.06.2010 00:31 |