Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Граф в виде связного списка

У меня есть пример реализации односвязного списка - структура и функция добавления в список элемента:
struct TNode { int value; TNode* pnext; };
void add2list(TNode **pphead, int val) { TNode **pp = pphead, *pnew; while(*pp) { if(val < (*pp)->value) break; else pp = &((*pp)->pnext); } pnew = new TNode; pnew->value = val; pnew->pnext = *pp; *pp = pnew; }
Хочу подобным образом представить граф в виде списка вершин и вложенных списков смежных вершин для каждой вершины:
struct Neighboor { // структура для списка смежных вершин int vertex_neighboor; Neighboor *pnext_neightboor; };
struct Node { int vertex; Node *pnext; Neighboor **first; //указатель на первый элемент вложенного списка соседних вершин };
Попытался подправить под это дело функцию add2list(), дописав еще одну, для заполнения списка смежностей. Прошу прощения за возможные нелепые ошибки, я пока новичок, только осваиваю язык.
void add2list(Neighboor **nnhead, int val) { Neighboor **rr = nnhead, *pnew; while (*rr) { if (val < (*rr)->vertex_neighboor) break; else rr = &((*rr)->pnext_neightboor); } pnew = new Neighboor; pnew->vertex_neighboor = val; pnew->pnext_neightboor = *rr; *rr = pnew; }
void add2list(Node **pphead, int val, int neighoods[]) { /*neighoods[] - массив смежных вершин*/ Node **pp = pphead, *pnew; while (*pp) { if (val < (*pp)->vertex) break; else pp = &((*pp)->pnext); } pnew = new Node; pnew->vertex = val; pnew->pnext = *pp; for(int i = 0; i < 2; i++) { /*В этом месте все падает. Двойка в цикле просто чтобы не заморачиваться пока, я передавал туда массив из двух элементов.*/ add2list((pnew->first), neighoods[i]); } *pp = pnew; }
Помогите найти ошибку или, если мой вариант совсем не дееспособен, подскажите способ реализовать задумку.
Выглядеть все должно в моем представлении как-то так:
________ **first _______ *next1 _______ *next2 *nextn |vertex_1| --> |neigh- | --> |neigh- | --> ... --> NULL |________| |boor_1 | |boor_2 | | *pnext_1 |_______| |_______| \/ ________ **first _______ *next2 _______ *next2 *nextn |vertex_2| --> |neigh- | --> |neigh- | --> ... --> NULL |________| |boor_1 | |boor_2 | | *pnext_2 |_______| |_______| \/
...
| *pnext_n \/ NULL


Ответ

Ну, как минимум, вы не инициализируете pnew->first, в нем у вас какой-то мусор, когда вы пытаетесь добавлять к нему список. Обнулите его перед циклом.
Но это точно C? У вас в наличии две функции с одним и тем же именем
void add2list(Neighboor **nnhead, int val); void add2list(Node **pphead, int val, int neighoods[]);
Такое отлично работает в C++, но не в C.

Комментариев нет:

Отправить комментарий