0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||||||||||||
1 | ||||||||||||||||
Массив указателей списков смежных вершин04.01.2014, 15:35. Показов 3400. Ответов 13
Метки нет (Все метки)
Добрый день. Помогите пожалуйста в реализации списка смежности для графа. Знаю, в инете много примеров, но пока для своего не нашел подходящего. Вот у меня есть структура:
В void main
Что делается не так, у меня выдает ошибку связанную с указателями. Как грамотней все это реализовать?
0
|
04.01.2014, 15:35 | |
Ответы с готовыми решениями:
13
Массив указателей на заголовки списков Шаблон структуры данных - массив указателей на заголовки списков Вывести количество вершин неориентированного графа, смежных с данной Массив указателей на массив строк и сортировка массива указателей |
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
04.01.2014, 15:56 [ТС] | 3 | |||||
0
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|
04.01.2014, 16:26 [ТС] | 5 |
да.
0
|
║XLR8║
|
||||||
04.01.2014, 16:43 | 6 | |||||
doorss, матрицу смежности я бы сделал так:
0
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
04.01.2014, 16:56 [ТС] | 7 | |||||
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 | 8 |
doorss, написать то можно все что угодно, вопрос в том зачем оно надо.
Я пока не совсем понимаю зачем надо хранить список смежности если уже есть матрица смежности. Обычно надо одно из двух а не оба варианта сразу. Список смежности я обычно храню в std::vector<std::set<int>>, вместо std::set можете использовать std::list если по заданию оно лучше, только насколько я помню лучше использовать std::vector вместо std::list в силу того что прошлые версии STL давали низкую производительность для std::list, std::queue. Добавлено через 5 минут Я не понимаю что выходите этим сделать, но если разименовать указатель first вы не получите указатель, это уже будет ссылка на объект, сразу вопрос если ли у first интерфейс доступа по индексу и т.д.
0
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
||||||
04.01.2014, 17:13 [ТС] | 9 | |||||
я бы хотел бы так реализовать, причем с помощью своего списка. Это в идеальном варианте.
Задумка такова: В классе мы имеем функцию, которая возвращает нам этот массив списков.
и потом следом, функция которая все это дело выводит.
0
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|||||||||||||||||||||
04.01.2014, 17:54 [ТС] | 11 | ||||||||||||||||||||
т.е так
Добавлено через 6 минут
Вобщем вот, почему то вылетает. Правильно ли у меня заполняется массив?
0
|
25 / 25 / 12
Регистрация: 04.01.2014
Сообщений: 91
|
|||||||||||
04.01.2014, 18:05 | 12 | ||||||||||
При хранении графа матрицей смежности расход памяти - O(n^2), где n - количество вершин.
При этом, если граф мало заполнен, т. е. ребер относительно немного, то в матрице смежности будет много нулей - несуществующих ребер, под которые расходуется память. Поэтому матрицей смежности имеет смысл хранить только почти полный граф. Реализация списками смежности лучше тем, что при в этом случае мы не заказываем памяти под несуществующие ребра, и память здорово экономится. (Расход памяти - O(n+m), где n - количество вершин в графе, m - кол-во ребер) Добавлено через 9 минут Нашел у себя реализацию: ХЕДР:
CPP:
0
|
0 / 0 / 0
Регистрация: 19.08.2013
Сообщений: 14
|
|||||||||||
04.01.2014, 21:40 [ТС] | 13 | ||||||||||
__General__, спасибо за код, но мне бы хотелось услышать, где выше приведенном в моем коде ошибка, чтобы понять, что я не так делаю. Реализаций много, у меня по другому чуть сделано.
Добавлено через 3 часа 22 минуты Помогите, я уже запутался, вылетает. Ошибка сегментации, возможно, я не правильно заполняю списки.
0
|
25 / 25 / 12
Регистрация: 04.01.2014
Сообщений: 91
|
||||||
05.01.2014, 04:05 | 14 | |||||
Ну в add_el(...) я ошибок не нашел.
Единственное что - если вы хотите добавлять элементы в хвост списка, то было бы рационально помнить в самой структуре его хвост, чтобы не идти до последнего элемента каждый раз в цикле. (В вашем случае добавление осуществляется за O(n), хотя можно за O(1)). Ну или можно добавлять новые элементы в голову. Теперь по поводу listMatrix(). Прежде всего, сразу бросается в глаза то, что тип возвращаемого значения не совпадает с объявленным типом функции: функция у вас имеет тип list**, а возвращаете вы *(first), то есть list*; Потом, у вас ошибка при вызове add_el: first имеет тип list**, значит first[i] - list*, *(first[i]) - list. В то время как add_el - функция типа list*. Собственно, у вас и в качестве аргумента add_elвыступает *(first[i]) вместо должного first[i]. Добавлено через 32 минуты Ааа, я похоже неправильно понял. first у вас - массив указателей на указатель... Короче, массив переменных типа list**, а не list*, как показалось мне сначала. В таком случае, код, вроде, должен компилироваться. Правда, я не совсем понимаю, зачем вы объявили такой массив... Вы, я так понял, хотите ,чтобы функция listMatrix() возвращала массив указателей на списки (то есть указатель на первый элемент массива, он же - его имя). Однако, вы возвращаете первый(нулевой) элемент массива указателей на указатели на ваши списки, который не является указателем на первый элемент нужного массива. PS Сделайте first просто массивом указателей (list*). Дальше подправьте все ,что нужно подправить (в конце тогда должно стоять просто
ну как-то так...
0
|
05.01.2014, 04:05 | |
05.01.2014, 04:05 | |
Помогаю со студенческими работами здесь
14
Организация списков путём применения указателей и структур Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей Массив из указателей на масив из указателей на массив из int) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |