Я пытался реализовать неориентированный граф с матрицей смежности.
Тип значения вершины — целое число. И я использую двойной указатель для представления матрицы смежности.
Вопрос в том, что сразу после того, как я ввел все значения вершин, как я
запрограммировал из кода, который я разместил ниже,
произошла ошибка времени выполнения. Затем я добавил комментарий к строке с содержанием ошибки,
из которой возникает ошибка. Я знаю, что причиной должен быть двойной указатель
, который я выделил. Но я действительно понятия не имею, как его отлаживать.
Может ли кто-нибудь мне помочь? Благодарю вас!
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int adj;
}verNode;
typedef struct graph
{
verNode **matrix;
int* verList;
int verNum;
int edgeNum;
}graph;
graph* createGraph(int v)
{
graph *g=malloc(sizeof(graph));
if(!g) exit(-1);
g->matrix=NULL;
g->verList=malloc(sizeof(verNode)*v);
if(!g->verList) exit(-1);
g->verNum=v;
printf("Enter the value of vertices:\n");
for(int i=0;i<g->verNum;i++)
{
printf("Enter the value of vertex %d:\n",i);
scanf("%d",g->verList);
}
return g;
}
verNode** createMatrix(graph *g)
{
if(!g) exit(-1);
g->matrix=malloc(sizeof(int*)*g->verNum*g->verNum);
if(!g->matrix) exit(-1);
for(int i=0;i<g->verNum;i++)
{
for(int j=0;j<g->verNum;j++)
{
(*g->matrix)->adj=0; //error:EXC_BAD_ACCESS (code=1, //address=0x0)
}
}
return g->matrix;
}
void addEdge(graph *g,int v)
{
if(!g||!g->matrix||!g->verList) exit(-1);
int ver1,ver2;
g->edgeNum=v;
printf("Enter the indexes of the vertices:\n");
for(int i=0;i<g->edgeNum;i++)
{
printf("Enter the index of vertex 1:\n");
scanf("%d",&ver1);
printf("Enter the index of vertex 2:\n");
scanf("%d",&ver2);
if(ver1>g->verNum-1||ver2>g->verNum-1) exit(-1);
g->matrix[ver1][ver2].adj=1;
g->matrix[ver2][ver1].adj=1;
}
}
void printMatrix(graph *g)
{
if(!g||!g->matrix||!g->verList) exit(-1);
printf("Print the adjacency matrix:");
for(int i=0;i<g->verNum;i++)
{
for(int j=0;j<g->verNum;j++)
{
printf("%d ",g->matrix[i][j].adj);
}
printf("\n");
}
}
int main() {
graph *g=createGraph(5);
verNode **matrix =createMatrix(g);
g->matrix=matrix;
addEdge(g,7);
return 0;
}