матрица смежности не распределяет c должным образом - PullRequest
1 голос
/ 05 мая 2020

У меня есть структура графа с v, представляющим количество узлов, и **adjmatrix, которое является матрицей смежности, у меня проблема с инициализацией всех элементов с 0, я получаю ошибку сегментации на adjmatrix[0][0]=0.

Структура выглядит так:

struct Graph {
    int V;
    int **adjmatrix;
};

А это функция для инициализации графика:

struct Graph *createGraph(int V) {
    struct Graph *graph = (struct Graph *)malloc(sizeof(struct Graph));
    graph->V = V;
    graph->adjmatrix = (int *)malloc(V * V * sizeof(int));
    int i, j;
    for (i = 0; i < V; ++i) {
        for (j = 0; j < V; j++) {
            graph->adjmatrix[i][j] = 0; //here is where i get segmentation fault
        }
    }
    return graph;
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Вы выделяете место для компактной 2D-матрицы, но тип adjmatrix подразумевает косвенную 2D-матрицу, ie: указатель на массив V указателей на массивы V целых чисел.

Вы можете выделить это с помощью al oop и calloc(), так что он уже инициализирован как 0:

struct Graph *createGraph(int V) {
    struct Graph *graph = malloc(sizeof(*graph));
    graph->V = V;
    graph->adjmatrix = calloc(V, sizeof(*graph->adjmatrix));
    for (int i = 0; i < V; i++) {
        graph->adjmatrix[i] = calloc(V, sizeof(*graph->adjmatrix[i]));
    }
    return graph;
}
0 голосов
/ 05 мая 2020
   graph->adjmatrix = (int **)malloc(V * sizeof(int*));
        graph->adjmatrix = (int *)malloc(V * V * sizeof(int));

неверно.
Что вам нужно сделать:

graph->adjmatrix=malloc(V*sizeof(int *));
for (int i=0;i<V;i++){
    graph->adjmatrix[i]=malloc(V*sizeof(int));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...