У меня есть пример реализации односвязного списка - структура и функция добавления в список элемента:
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.
Комментариев нет:
Отправить комментарий