Я думаю, вам нужно изменить
struct Graph *G= (struct Graph*)malloc(sizeof(struct Graph*));
на
struct Graph *G= malloc(sizeof(struct Graph));
, так как вам нужно место, выделенное для хранения структурной переменной, а не указателя.
И выне выделил место для G->adj
правильно.
Попробуйте
G->adj = malloc(sizeof(int **));
for(int i=0; i<G->V; ++i)
{
G->adj[i]=malloc(sizeof(int)*G->V);
}
И измените ваш цикл на
for(i=0;i<G->V;i++)
{
for(j=0;j<G->V;j++)
{
G->adj[i][j]=0;
}
}
, т. е. измените <=
на<
для предотвращения доступа за пределы массива.
И, читая края, не делайте
scanf("%d %d\n", &u,&v);
с новой строкой в конце.См. this .
Кроме того, вам необходимо проверить, находятся ли введенные значения для u
и v
в пределах, указанных в
for(i=0;i<G->E;i++)
{
printf("Enter the source and destination : ");
scanf("%d %d", &u,&v);
if(u<G->V && v<G->V)
{
G->adj[u][v]=1;
G->adj[v][u]=1;
}
else
{
printf("\ninvalid value. Try again.");
i--;
}
}
И выне нужно выделять место для этого указателя struct
в main()
, поскольку вы уже выделяете память для значения, которое вы будете хранить в этом указателе в функции addelements()
.В противном случае это приведет к утечке памяти.
Итак, в main()
выполните
struct Graph *a= addelements();
Обратите внимание, что malloc()
возвращает NULL
, если не удалось выделить память.Вам также необходимо проверить, не завершаются ли вызовы malloc()
.
И вам не нужно приводить возвращаемое значение malloc()
в C. Прочитайте this .