Я думаю, что у вас проблемы с пониманием указателя и параметров в функции C. Я предполагаю, что вы объявляете n как указатель на int, потому что вы используете int *
в прототипе вашей функции.
Первое решение, объявите n и stv как int, используйте их как целые числа и передайте их адрес в вызове функции.
...
int n, stv, i, j, nsz, nedg, fr, to, vtx, wt;
...
n = nsz;
stv = vtx;
int total_cost = prims(amtrx, &n);
printpaths(&n);
Но в функциях prims
и printpaths
вы не меняете значение n, поэтому вам не нужен указатель на n.
...
int n, stv, i, j, nsz, nedg, fr, to, vtx, wt;
...
n = nsz;
stv = vtx;
int total_cost = prims(amtrx, n);
printpaths(n);
...
int prims(int amtrx[][N], int n) {
int cost[N][N];
int u, v, min_distance, distance[N], from[N];
int visited[N], no_of_edges, i, min_cost, j;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
if(amtrx[i][j] == 0)
cost[i][j] = INF;
else {
cost[i][j] = amtrx[i][j];
spanning[i][j] = 0;
}
}
distance[0] = 0;
visited[0] = 1;
for(i = 1; i < n; i++) {
distance[i] = cost[0][i];
from[i] = 0;
visited[i] = 0;
}
min_cost = 0;
no_of_edges = n - 1;
while(no_of_edges > 0) {
min_distance = INF;
for(i = 1; i < n ; i++)
if(visited[i] == 0 && distance[i] < min_distance) {
v = i;
min_distance = distance[i];
}
u = from[v];
spanning[u][v] = distance[v];
spanning[v][u] = distance[v];
no_of_edges--;
visited[v] = 1;
for(i = 1; i < n; i++)
if(visited[i] == 0 && cost[i][v] < distance[i]) {
distance[i] = cost[i][v];
from[i] = v;
}
min_cost = min_cost + cost[u][v];
}
return min_cost;
}
void printpaths(int n) {
int i, j;
for(i = 0; i < n; i++) {
printf("\n");
for(j = 0; j < n; j++)
printf("%d\t", spanning[i][j]);
}
}
To очень кратко объясните свою ошибку:
n - это указатель на int, и вы присваиваете ему 0 (n=0
). Так что это указывает на «нулевой» адрес памяти. (Rq: слишком долго, чтобы объяснить, что означает «нулевой» адрес памяти, поэтому я использую «»). После, когда вы пишете *n=nsz
, вы пытаетесь записать значение nsz по этому «нулевому» адресу памяти, который запрещен. Если вы хотите использовать указатель, вы должны выделить память для хранения значения, как предложил Хитокири.