|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||||||||||||
Массив указателей списков смежных вершин04.01.2014, 15:35. Показов 3758. Ответов 13
Метки нет (Все метки)
Добрый день. Помогите пожалуйста в реализации списка смежности для графа. Знаю, в инете много примеров, но пока для своего не нашел подходящего. Вот у меня есть структура:
В void main
Что делается не так, у меня выдает ошибку связанную с указателями. Как грамотней все это реализовать?
0
|
||||||||||||||||
| 04.01.2014, 15:35 | |
|
Ответы с готовыми решениями:
13
Массив указателей на заголовки списков Шаблон структуры данных - массив указателей на заголовки списков Вывести количество вершин неориентированного графа, смежных с данной |
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
| 04.01.2014, 15:56 [ТС] | ||||||
0
|
||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|
| 04.01.2014, 16:26 [ТС] | |
|
да.
0
|
|
|
║XLR8║
|
||||||
| 04.01.2014, 16:43 | ||||||
|
doorss, матрицу смежности я бы сделал так:
0
|
||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
| 04.01.2014, 16:56 [ТС] | ||||||
|
outoftime , прошу прощение. Я думал, под stl вы имеете ввиду не вектор, а стандартный list. Мне хочется через списки реализовать. Это ведь не сложно. Всего надо сделать одномерный массив, размерности кол-во вершин, и чтобы он хранил указатели на начало нескольких списков. В свою очередь каждый список из матрицы смежности заполняется. У меня проблема вышла, когда я начал создавать функцию которая возвращает такой одномерный массив. И в итоге у меня ничего не вышло.
Добавлено через 8 минут
D:\class-graph\main.cpp||In member function 'void Graph::listMatrix(list*&)':| D:\class-graph\main.cpp|127|error: cannot convert 'list' to 'list*' for argument '1' to 'list* add_el(list*, int)'| D:\class-graph\main.cpp||In member function 'void Graph::display(list*)':| D:\class-graph\main.cpp|132|error: cannot convert 'list' to 'list*' for argument '1' to 'void print_list(list*)'| D:\class-graph\main.cpp||In function 'int main()':| D:\class-graph\main.cpp|179|error: no matching function for call to 'Graph::display()'| D:\class-graph\main.cpp|179|note: candidate is:| D:\class-graph\main.cpp|130|note: void Graph::display(list*)| D:\class-graph\main.cpp|130|note: candidate expects 1 argument, 0 provided| D:\class-graph\main.cpp|154|warning: unused variable 'first' [-Wunused-variable]| ||=== Build finished: 3 errors, 1 warnings (0 minutes, 2 seconds) ===|
0
|
||||||
|
║XLR8║
|
||
| 04.01.2014, 17:06 | ||
|
doorss, написать то можно все что угодно, вопрос в том зачем оно надо.
Я пока не совсем понимаю зачем надо хранить список смежности если уже есть матрица смежности. Обычно надо одно из двух а не оба варианта сразу. Список смежности я обычно храню в std::vector<std::set<int>>, вместо std::set можете использовать std::list если по заданию оно лучше, только насколько я помню лучше использовать std::vector вместо std::list в силу того что прошлые версии STL давали низкую производительность для std::list, std::queue. Добавлено через 5 минут
0
|
||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
| 04.01.2014, 17:13 [ТС] | ||||||
|
я бы хотел бы так реализовать, причем с помощью своего списка. Это в идеальном варианте.
Задумка такова: В классе мы имеем функцию, которая возвращает нам этот массив списков.
и потом следом, функция которая все это дело выводит.
0
|
||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|||||||||||||||||||||
| 04.01.2014, 17:54 [ТС] | |||||||||||||||||||||
|
т.е так
Добавлено через 6 минут
Вобщем вот, почему то вылетает. Правильно ли у меня заполняется массив?
0
|
|||||||||||||||||||||
|
25 / 25 / 12
Регистрация: 04.01.2014
Сообщений: 91
|
||||||||||||
| 04.01.2014, 18:05 | ||||||||||||
|
При этом, если граф мало заполнен, т. е. ребер относительно немного, то в матрице смежности будет много нулей - несуществующих ребер, под которые расходуется память. Поэтому матрицей смежности имеет смысл хранить только почти полный граф. Реализация списками смежности лучше тем, что при в этом случае мы не заказываем памяти под несуществующие ребра, и память здорово экономится. (Расход памяти - O(n+m), где n - количество вершин в графе, m - кол-во ребер) Добавлено через 9 минут Нашел у себя реализацию: ХЕДР:
CPP:
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|||||||||||
| 04.01.2014, 21:40 [ТС] | |||||||||||
|
__General__, спасибо за код, но мне бы хотелось услышать, где выше приведенном в моем коде ошибка, чтобы понять, что я не так делаю. Реализаций много, у меня по другому чуть сделано.
Добавлено через 3 часа 22 минуты Помогите, я уже запутался, вылетает. Ошибка сегментации, возможно, я не правильно заполняю списки.
0
|
|||||||||||
|
25 / 25 / 12
Регистрация: 04.01.2014
Сообщений: 91
|
|||||||
| 05.01.2014, 04:05 | |||||||
|
Ну в add_el(...) я ошибок не нашел.
Единственное что - если вы хотите добавлять элементы в хвост списка, то было бы рационально помнить в самой структуре его хвост, чтобы не идти до последнего элемента каждый раз в цикле. (В вашем случае добавление осуществляется за O(n), хотя можно за O(1)). Ну или можно добавлять новые элементы в голову. Теперь по поводу listMatrix(). Прежде всего, сразу бросается в глаза то, что тип возвращаемого значения не совпадает с объявленным типом функции: функция у вас имеет тип list**, а возвращаете вы *(first), то есть list*; Потом, у вас ошибка при вызове add_el: Собственно, у вас и в качестве аргумента add_elвыступает *(first[i]) вместо должного first[i]. Добавлено через 32 минуты Ааа, я похоже неправильно понял. first у вас - массив указателей на указатель... Короче, массив переменных типа list**, а не list*, как показалось мне сначала. В таком случае, код, вроде, должен компилироваться. Правда, я не совсем понимаю, зачем вы объявили такой массив... Вы, я так понял, хотите ,чтобы функция listMatrix() возвращала массив указателей на списки (то есть указатель на первый элемент массива, он же - его имя). Однако, вы возвращаете первый(нулевой) элемент массива указателей на указатели на ваши списки, который не является указателем на первый элемент нужного массива. PS Сделайте first просто массивом указателей (list*). Дальше подправьте все ,что нужно подправить (в конце тогда должно стоять просто
ну как-то так...
0
|
|||||||
| 05.01.2014, 04:05 | |
|
Помогаю со студенческими работами здесь
14
Массив указателей на массив строк и сортировка массива указателей
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Массив из указателей на масив из указателей на массив из int) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|